Unicode and UTF-8. Рвем волосы на голове.  

Posted in ,

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

Но с юникодом бывает много проблем, т.к. для начала наиболее расспространенные операционные системы используют "снаружи" однобайтовые кодировки и на этапе создания основных языков програмирования поддержка UTF не была заложена. Юникод был предложен как универсальная кодирвка в 1991 году, и в 1993 уже использовалась версия 1.1. Сейчас при слове "юникод" у большенства всплывает в голове аббревиатура UTF-8. Но честно говоря UTF-8 - это не юникод. Чуть более внимательно вчитавшись в определения можно подчеркнуть, что "Юникод" - это стандарт кодирования символов. А UTF-8 - кодировка, реализующая представление Юникода. Основная черта UTF-8 заключаеться в том, что первые 128 символов совпадает с ASCII, что дает обратную совместимость с ПО "не умеющим" юникод.

Всеже "Настоящим" юникодом считается UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE. Собственно первая версия кодирования юникода была 16-битной, с фиксированной шириной символа. Windows начиная с 2000 внутри себя использует UTF-16LE. В мире *nix принято использовать UTF-8.

И наконец о том, как все это касается нас. Редактирование файлов в нужной кодировке, темпаче если она отличается от системной становится не найтивной. Впрочем всегда решается удачным редактором, или толковым IDE. Для простых целей - это EditPro (win) и JOE (*nix). Тексты - это только пол беды. Оснавная беда - это языки програмирования. Про С/С++ говорить не имеет смысла, т.к. язык достаточно низкого уровня и собственно является основой для всего остального. А все остальное - это как минимум JAVA, Perl, PHP, Python, etc..

О некоторых тонкостях стоит рассказать. От простого к сложному.
JAVA - найтивно поддерживает юникод. JDK 1.5 полностью реализовывает стандарт Unicode 4.0.
PHP - впринципе при работе с UTF-8 не возникает никаких проблем. Пока речь не доходит до регулярных выражений и мультабайтных строчек. Есть несколько библиотек, которые решают возникающие проблемы, не считая iconv конечно. Собственно для поддержки всего рациона кодировок в PHP есть mbstring.
Perl - изначально работает на своей собственной кодировке, т.е. имеет внутренние представление текста. Впринципе при работе с однобайтными кодировками это не заметно, т.к. кодировка определяется автоматически. В остальных случаях её следует указывать для источника данных и для вывода. Тут неплохо об этом написано. Вообщем ясная документация дает все ответы:
http://perldoc.perl.org/functions/open.html
http://perldoc.perl.org/Encode.html.

Пример работы с разными кодировками в Perl:
open(SQLFILE, "<:encoding(UTF-16LE)", $SQL_files{$item})
$current_sql_query =~ s/\x{FEFF}//g; ## срезаем спецсимволы.
$current_sql_query_utf8 = encode("UTF-8",$current_sql_query);

Об остальных языках я пожалуй говорить не буду.
На закуску, настоящий юникод: http://www.unicode.org/~scherer/emoji4unicode/snapshot/full.html

Да, есть ещё одна забавная штука - юникод в виндовой консоле.
Ставим PowerShell, в нем помимо иных возможностей можно менять кодировку на лету:
$OutputEncoding = [System.Text.Encoding]::UTF8

Другие материалы:
http://docs.activestate.com/activeperl/5.10/lib/Encode/Unicode.html
http://www.utf8-chartable.de/
http://www.php.net/manual/en/regexp.reference.php
http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php
http://www.mapbender.org/Encoding_UTF8/ISO8859-1#utf8_decode
http://webcollab.sourceforge.net/unicode.html

4 responzez

ссылки вконце - ссылками.

статью в личный блог на хабр.)
(в целях пиара.)

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

Но честно говоря UTF-8 - это не юникод, это подпорка или переходная версия, т.к.используется 8 байт на символ, притом первые 128 символов совпадает с ASCII. Так получается, что этот юникод сам себе противоречит - он регионально зависим, для каждого языка свой набор символов.

Я честно пытался понять, что здесь написано. Вы, походу, вообще не понимаете что такое юникод (юникод - не кодировка) и что такое UTF-8 (кодировка). И в чём разница между ними - тем более. "Используется 8 байт на символ, притом первые 128 символов совпадает с ASCII" - это вообще капец :)))

Для начала - спасибо за комментарий.


Наверное я действительно не понимаю чего-то. А писать о том, чего не понимаешь - это крейне не одобрительно )

Если вы мне подкините адекватные материалы для размышления, я с удовольствием над ними поразмышляю.

Итак, в чем кроется тонкая разница между понятиями "Юникод" и UTF-8 ?

Итак. Ровно по википедии:
UTF-8 — в настоящее время распространённая кодировка, реализующая представление Юникода, совместимое с 8-битным кодированием текста.

Юникод — стандарт кодирования символов, позволяющий представить знаки практически всех письменных языков.

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

Текст исправлю, что касается данного момента. Ещё раз спасибо, что указали на столь нелепые ошибки.

Post a Comment

metanews


Add to Google