Какую кодировку символов следует использовать для веб-страницы, содержащей в основном арабский текст?Все в порядке с utf-8? - PullRequest
13 голосов
/ 08 июня 2010

Какую кодировку символов следует использовать для веб-страницы, содержащей в основном арабский текст?

С utf-8 все в порядке?

Ответы [ 5 ]

15 голосов
/ 08 июня 2010

UTF-8 может хранить весь диапазон Unicode, поэтому его можно использовать для арабского языка.


Однако, если вам интересно, какая кодировка будет наиболее эффективной:

Все арабские символы могут быть закодированы с использованием одной кодовой единицы UTF-16 (2 байта), но они могут занимать 2 или 3 кодовых единицы UTF-8 (1 байт каждая), поэтому, если вы просто кодировали арабский язык, UTF -16 будет более экономичным вариантом.

Однако вы не просто кодируете арабский язык - вы кодируете значительное количество символов, которые могут храниться в одном байте в UTF-8, но занимают два байта в UTF-16; все символы кодировки html <, &, >, = и все имена элементов html.

Это компромисс, и, если вы не имеете дело с огромными документами, это не имеет значения.

10 голосов
/ 14 июня 2010

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

1. Окна-1256

Это наиболее распространенная кодировка на арабских сайтах. Он работает в большинстве случаев (90%) для арабских пользователей.

Вот один из крупнейших арабских форумов по веб-разработке: http://traidnt.net/vb/. Вы можете видеть, что они используют эту кодировку.

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

2. UTF-8

Эта кодировка решает предыдущую проблему и также работает в URL. Я имею в виду, если вы хотите, чтобы арабские слова были в вашем URL, вам нужно, чтобы они были в utf-8, иначе это не сработает.

Недостатком этой кодировки является то, что если вы собираетесь сохранять арабский контент в базе данных (например, MySql), используя эту кодировку (поэтому база данных также будет кодироваться с помощью utf-8), ее размер будет вдвое больше, чем он было бы, если бы оно было закодировано с помощью windows-1256 (поэтому база данных будет закодирована с помощью latin-1).

Я предлагаю перейти на utf-8, если вы можете позволить себе увеличение размера.

8 голосов
/ 08 июня 2010

UTF-8 в порядке, да. Он может кодировать любую кодовую точку в стандарте Unicode.


Отредактировано для добавления

Чтобы сделать ответ более полным, ваш реалистичный выбор:

  • UTF-8
  • UTF-16
  • UTF-32

У каждого есть компромиссы и преимущества.

UTF-8

Как указывает Джо Готерин , UTF-8 очень эффективен для европейских текстов, но может становиться все более неэффективным по мере удаления от латинского алфавита. Если ваш текст полностью арабский, он на самом деле будет больше, чем эквивалентный текст в UTF-16. Однако на практике это редко является проблемой в наши дни дешевой и обильной оперативной памяти, если у вас нет большого количества текста для решения. Еще одной проблемой является то, что переменная длина кодирования делает некоторые строковые операции трудными и медленными. Например, вы не можете легко получить пятый арабский символ в строке, потому что некоторые символы могут иметь длину 1 байт (например, знаки препинания), а другие - два или три. Это делает обработку строк медленной и подверженной ошибкам.

С другой стороны, UTF-8, вероятно, ваш лучший выбор, если вы делаете много смешанного европейского / арабского текста. Чем больше европейского текста в ваших документах, тем лучше будет выбор UTF-8.

UTF-16

UTF-16 даст вам лучшую эффективность использования пространства, чем UTF-8, если вы используете преимущественно арабский текст. Однако я не знаю об арабских кодовых точках, поэтому я не знаю, рискуете ли вы иметь здесь кодировки переменной длины. (Однако я предполагаю, что это не проблема.) Если у вас действительно есть кодировки переменной длины, все проблемы с обработкой строк в UTF-8 также применимы и здесь. Если нет, то никаких проблем.

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

UTF-32

UTF-32 в основном удвоит ваши требования к пространству. С другой стороны, он имеет постоянный размер для всех известных (и, вероятно, неизвестных;) скриптовых форм. Для обработки необработанных строк это ваш самый быстрый и лучший вариант без проблем, которые вызовет кодирование переменной длины. (Это предполагает, что у вас есть строковая библиотека, которая знает о 32-битных символах, естественно.)

Рекомендация

Моя собственная рекомендация - использовать UTF-8 в качестве внешнего формата (потому что его поддерживают все) для хранения, передачи и т. Д., Если вы действительно не увидите преимущества в размере с UTF-16. Поэтому каждый раз, когда вы читаете строку из внешнего мира, это будет UTF-8, и каждый раз, когда вы помещаете строку во внешний мир, это тоже будет UTF-8. Однако внутри вашего программного обеспечения, если только вы не привыкли манипулировать массивными строками (в этом случае я бы порекомендовал разные структуры данных!), Я бы рекомендовал использовать вместо этого UTF-16 или UTF-32 (в зависимости от того, есть ли проблемы кодирования переменной длины в ваших данных UTF-16) для повышения эффективности и простоты кода.

2 голосов
/ 08 июня 2010

UTF-8 - самый простой способ, так как он будет работать практически со всем:

UTF-8 может кодировать любой Unicode персонаж. Файлы в разных языки могут отображаться правильно без необходимости выбирать правильный кодовая страница или шрифт. Например Китайский и арабский могут быть в одном текст без специальных кодов, вставленных в переключите кодировку. (через википедию )

Конечно, имейте в виду, что:

UTF-8 часто занимает больше места, чем кодировка сделана для одного или нескольких языки. Латинские буквы с диакритическими знаками и символы из других букв сценарии обычно занимают один байт персонаж в соответствующем многобайтовое кодирование, но взять два в UTF-8. Восточноазиатские сценарии вообще иметь два байта на символ в их многобайтовые кодировки еще занимают три байтов на символ в UTF-8.

... но в большинстве случаев это не большая проблема. Это станет единым целым, если вы начнете обрабатывать огромные документы.

0 голосов
/ 21 апреля 2013

UTF-8 часто занимает больше места, чем кодировка, созданная для одного или нескольких языков.Латинские буквы с диакритическими знаками и символы из других алфавитных сценариев обычно занимают один байт на символ в соответствующей многобайтовой кодировке, но в UTF-8 - два.В восточноазиатских сценариях обычно используется два байта на символ в многобайтовых кодировках, но в UTF-8 - по три байта на символ.

...