std:: преобразование строки в char32_t (символы Юникода)

#c #string #unicode #unicode-string

#c #строка #юникод #юникод-строка

Вопрос:

Мне нужно прочитать файл, используя fstream на C , который имеет ASCII , а также Unicode символы, использующие getline функцию.
Но функция использует только std::string и символы этих простых строк не могут быть преобразованы в char32_t , чтобы я мог сравнить их с символами Юникода. Поэтому, пожалуйста, кто-нибудь может дать какое-либо исправление.

Комментарии:

1. Когда вы говорите «символ Юникода», в какой кодировке он находится? Если это UTF-8, то вам больше ничего не нужно делать.

2. Прежде чем вы сможете добиться какого-либо прогресса, вам нужно знать, какова кодировка текста. Пока вы этого не узнаете, бессмысленно что-либо делать.

Ответ №1:

char32_t соответствует кодировке UTF-32, которая почти никогда не используется (и часто плохо поддерживается). Вы уверены, что ваш файл закодирован в UTF-32?

Если вы уверены, то вам нужно использовать std::u32string для хранения вашей строки. Для чтения вы можете использовать std::basic_stringstream<char32_t> , например. Однако, пожалуйста, обратите внимание, что эти типы, как правило, плохо поддерживаются.

Юникод обычно кодируется с помощью:

  • UTF-8 в текстовых файлах (и веб-страницах и т.д.)

  • 16-разрядная или 32-разрядная кодировка для конкретной платформы в программах, использующая тип wchar_t

Таким образом, универсально закодированные файлы находятся в UTF-8. Они используют переменное количество байтов для кодирования символов, от 1 (символы ASCII) до 4. Это означает, что вы не можете напрямую протестировать отдельные символы, используя std::string

Для этого вам необходимо преобразовать строку UTF-8 в wchar_t строку, хранящуюся в std::wstring .

Для этого используйте конвертер, определенный следующим образом:

 std::wstring_convert<std::codecvt_utf8<wchar_t> > converter;
  

И конвертируйте вот так:

 std::wstring unicodeString = converter.from_bytes(utf8String);
  

Затем вы можете получить доступ к отдельным символам Юникода. Не забудьте поставить «L» перед каждым строковым литералом, чтобы сделать его строковым литералом Юникода. Например:

 if(unicodeString[i]==L'仮')
{
    info("this is some japanese character");
}
  

Комментарии:

1. Примечание : в Linux wchar_t на самом деле является UTF-32, но вы не должны полагаться на это.

2. Вы не должны использовать wchar_t, поскольку он зависит от платформы и не гарантирует возможность хранения символов Юникода.

3. совершенно другое дело. Вам нужен 32-битный тип для хранения любой кодовой точки Unicode.