#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.