Как конвертировать UTF-8 std :: string в UTF-16 std :: wstring?

Если у меня есть std::string UTF-8, как мне преобразовать его в UTF-16 std::wstring ? На самом деле, я хочу сравнить два персидских слова.

Вот какой код. Только слегка проверены и, вероятно, есть несколько улучшений. Вызовите эту функцию, чтобы преобразовать строку UTF-8 в wstring UTF-16. Если он считает, что входная строка не является UTF-8, тогда она выдает исключение, иначе она возвращает эквивалентную USTF-16 wstring.

 std::wstring utf8_to_utf16(const std::string& utf8) { std::vector unicode; size_t i = 0; while (i < utf8.size()) { unsigned long uni; size_t todo; bool error = false; unsigned char ch = utf8[i++]; if (ch <= 0x7F) { uni = ch; todo = 0; } else if (ch <= 0xBF) { throw std::logic_error("not a UTF-8 string"); } else if (ch <= 0xDF) { uni = ch&0x1F; todo = 1; } else if (ch <= 0xEF) { uni = ch&0x0F; todo = 2; } else if (ch <= 0xF7) { uni = ch&0x07; todo = 3; } else { throw std::logic_error("not a UTF-8 string"); } for (size_t j = 0; j < todo; ++j) { if (i == utf8.size()) throw std::logic_error("not a UTF-8 string"); unsigned char ch = utf8[i++]; if (ch < 0x80 || ch > 0xBF) throw std::logic_error("not a UTF-8 string"); uni <<= 6; uni += ch & 0x3F; } if (uni >= 0xD800 && uni <= 0xDFFF) throw std::logic_error("not a UTF-8 string"); if (uni > 0x10FFFF) throw std::logic_error("not a UTF-8 string"); unicode.push_back(uni); } std::wstring utf16; for (size_t i = 0; i < unicode.size(); ++i) { unsigned long uni = unicode[i]; if (uni <= 0xFFFF) { utf16 += (wchar_t)uni; } else { uni -= 0x10000; utf16 += (wchar_t)((uni >> 10) + 0xD800); utf16 += (wchar_t)((uni & 0x3FF) + 0xDC00); } } return utf16; } 

Так вы делаете это с C ++ 11 :

 std::string str = "your string in utf8"; std::wstring_convert> converter; std::wstring wstr = converter.from_bytes(str); 

И это те заголовки, которые вам нужны:

 #include  #include  #include  #include  

Более полный пример доступен здесь: http://en.cppreference.com/w/cpp/locale/wstring_convert/from_bytes

Есть некоторые важные вопросы и ответы здесь и здесь, которые стоит прочитать.

В основном вам нужно преобразовать строку в общий формат – я предпочитаю всегда конвертировать в UTF-8, но ваш пробег может быть осторожным.

Было много программного обеспечения, написанного для преобразования – конверсия является перенапряжением вперед и может быть написана через несколько часов – однако почему бы не подобрать то, что уже сделано, например, UTF-8 CPP

Эта страница также кажется полезной: http://www.codeproject.com/KB/string/UtfConverter.aspx

В разделе комментариев этой страницы также есть несколько интересных предложений для этой задачи:

 // Get en ASCII std::string from anywhere std::string sLogLevelA = "Hello ASCII-world!"; std::wstringstream ws; ws << sLogLevelA.c_str(); std::wstring sLogLevel = ws.str(); 

Или

 // To std::string: str.assign(ws.begin(), ws.end()); // To std::wstring ws.assign(str.begin(), str.end()); 

Хотя я не уверен в обоснованности этих подходов ...

  • Проверьте, содержит ли строка строку в C ++
  • Заменить подстроку NSAttributedString на другую NSAttributedString
  • Извлечь целочисленную часть в строке
  • Как изменить строку на C или C ++?
  • Пул строк и постоянный пул
  • Java конвертирует int в hex и обратно
  • Преобразование строки в double в C #
  • Как заменить буквенные подстроки без учета регистра в Java
  • Как читать / писать строки из файла на Android
  • Разделить строку на подстроки равной длины в Java
  • Почему кеш-код hashCode () не указан 0?
  • Давайте будем гением компьютера.