У меня есть функция, которая получает wchar_t*
в качестве ввода. Теперь в этой функции мне приходится обрабатывать кодовые точки.
Поскольку эта программа должна работать на нескольких платформах, я очень мало знаю о кодировании в wchar_t*
,
Я пытался получить преобразование из wchar_t*
в char32_t*
с помощью std::codecvt<char32_t, wchar_t, std::mbstate_t>
, К сожалению, эта специализация, кажется, не существует.
Тогда я подумал, что, возможно, смогу просто использовать wchar_t*
в качестве входного буфера только для чтения icu::UnicodeString
, но, кажется, я сначала должен преобразовать в UChar*
с помощью u_strFromWCS
, Но опять же мне сначала нужно выделить UChar
буфер, с правильным количеством кодовых блоков в UChar
,
Может кто-нибудь сказать мне, какой самый эффективный способ доступа к кодовым точкам в wchar_t*
является?
Если я не ошибаюсь, следующий пример должен использовать две кодовые единицы на кодовую точку.
const wchar_t *test = L"A 剝Ц B";
Стандарт очень мало говорит о кодировке или о чем-либо wchar_t
поэтому у вас не может быть решения без каких-либо предположений.
Разумное предположение, что если sizeof(wchar_t) == 2
(в Windows) это UTF-16, а если sizeof(wchar_t) == 4
это UTF-32 (в Unix), поэтому вы можете использовать макросы или шаблоны для выбора во время компиляции, какой из них выбрать. Если это возможно для чего-то в wchar_t
чтобы быть закодированным в какой-то устаревшей кодировке, поскольку нет общего способа автоматически определять кодировку, вы должны получить информацию о кодировке в другом месте.
Упрощенно, wchar_t содержит символ Unicode. В моем коде я часто получаю доступ к каждому символу кода по индексам (если я не правильно понял ваш вопрос).
wchar_t* unicodeString = L"this is a unicode string";
unicodeString [0] является одним символом