LINUX.ORG.RU

Нужен алгоритм проверки символа на соответствие Unicode (UTF-8)


0

0

Здравствуйте все!

Нужен соб-но сабж. Зачем... ? Дело в том, что при создании базы в postgres и указании ей локали unicode, возникает проблема (исключительная ситуация) если в неё попытаться записать хотя бы один символ в windows-1251.

Запретить это я не могу. Поэтому нужно либо устанавливать локаль win1251 либо проверять на соответствие и работать по человечески.

Как вариант, может есть какая либо либа для автоматического преобразования любой кодировки в unicode, это тоже было бы решением проблемы.

Заранее благодарю...

> Как вариант, может есть какая либо либа для автоматического
> преобразования любой кодировки в unicode, это тоже было бы решением
> проблемы.

Может
man 1 iconv
man 3 iconv

Onanim
()
Ответ на: комментарий от Onanim

Спасибо за совет, но... во первых опять же возникает проблема, ей нужно сказать из какой в какую; во вторых перекодировать все подряд слишком много ресурсов сожрет.

Есть идея, задача упрощается, есть символ, например 'Ш', - чем в C++ можно определить, что он однобайтовый или многобайтовый (двухбайтовый)? Чем проиводительнее и стандартнее решение тем лучше. Строка находится в string. Это было бы наверное единственное нормальное решение.

merlin-shadow
() автор топика

Почитай внимательно про кодировку utf-8, ты можешь увидеть, что её структура довольно специфична, вот и проверяй её:

http://www.linuxdoc.ru/manpages/man7/utf-8.7.html

Но гарантированного способа автоматически определить кодировку произвольного символа, отличив win1251 от utf-8 просто не существует из-за перекрывающихся кодов.

anonymous_incognito ★★★★★
()

в perl есть функция is_utf8
можно вытащить из него

anonymous2 ★★★★★
()
Ответ на: комментарий от anonymous_incognito

Спасибо за man действительно очень полезный оказался. Жаль конечно, что на 100% все равно не проверишь, но возможно это хотябы поможет избежать исключительных ситуаций. А вот sizeof() тут не канает, как я и думал, по крайней мере мне это не помогло. И к сожалению в классе string lenght измеряется в byte-ах, а не в символах как должно быть. Всем спасибо, пошел изобретать велосипед ;-)

merlin-shadow
() автор топика
Ответ на: комментарий от merlin-shadow

Отличить во всех случаях, что произвольный отдельный символ дан в utf-8 или в cp1251 действительно невозможно. Но если имеется некоторый осмысленный текст, то такое различение практически гарантировано можно сделать. Я бы в этом направлении ещё покопал.

anonymous_incognito ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.