Проблема кодировки арабских символов: UTF-8 против Windows-1256 - PullRequest
6 голосов
/ 30 декабря 2011

Краткая справка : Я унаследовал большой файл дампа sql, содержащий комбинацию английского и арабского текста, и (я думаю) он был изначально экспортирован с использованием 'latin1'.Я изменил все вхождения 'latin1' на 'utf8' до импорта файла.Арабский текст не отображался правильно в phpmyadmin (что, я думаю, нормально), но когда я загрузил текст на веб-страницу со следующим ...

<meta http-equiv='Content-Type' content='text/html; charset=windows-1256'/> 

... все выглядело хорошои арабский текст отображается отлично.

Проблема : Мой клиент действительно очень требователен и не хочет менять его ...

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

... на эквивалент Windows-1256.Я не думал, что это будет проблемой, но когда я изменил значение набора символов на «UTF-8», все арабские символы появились как ромбы с вопросительными знаками.Разве UTF-8 не должен правильно отображать арабский текст?

Вот несколько замечаний по поводу конфигурации моей базы данных:

  • Кодировка базы данных: 'utf8'
  • Сортировка соединения с базой данных: 'utf8_general_ci'
  • Все базы данных, таблицы иприменимые поля были сопоставлены как 'utf8_general_ci'

Я просматривал переполнение стека и другие форумы для всего, что связано с моей проблемой.Я обнаружил похожие проблемы, но, похоже, решения не подходят для моей конкретной ситуации.Надеюсь, кто-то может помочь!

Ответы [ 4 ]

3 голосов
/ 30 декабря 2011

Если документ выглядит правильно при объявлении в кодировке windows-1256, то он, скорее всего, в кодировке windows-1256. Таким образом, очевидно, что он не был экспортирован с использованием latin1 - что было бы невозможно, так как latin1 не имеет арабских букв.

Если это всего лишь один файл, то самый простой способ - преобразовать его из кодировки windows-1256 в кодировку utf-8, используя, например, Notepad ++ . (Откройте файл в нем, измените кодировку через меню «Формат файла» на арабский, windows-1256. Затем выберите «Преобразовать в UTF-8» в меню «Формат файла» и выполните «Файл» → «Сохранить».)

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

2 голосов
/ 30 декабря 2011

Я думаю, вам нужно вернуться на круги своя. Похоже, у вас есть дамп базы данных в кодировке Win-1256, и вы хотите работать с ним в UTF-8 с этого момента. Это также звучит так, как будто вы используете PHP, но у вас есть много несоответствующих тегов в вашем вопросе и вы пропустили самый важный, PHP.

Во-первых, вам нужно конвертировать текстовый дамп в UTF-8, и вы должны быть в состоянии сделать это с помощью PHP. Скорее всего, ваш сценарий преобразования будет состоять из двух шагов: сначала прочитайте байты Win-1256 и декодируйте их во внутренние текстовые строки Unicode, а затем закодируйте текстовые строки Unicode в байты UTF-8 для вывода в новый текстовый файл.

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

После этого вам нужно просто прочитать базу данных и отобразить веб-страницу с правильной кодировкой UTF-8.

P.S. Фактически можно перекодировать данные каждый раз, когда вы их отображаете, но это не решает проблему наличия базы данных, заполненной неправильно закодированными данными.

2 голосов
/ 30 декабря 2011

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

Вы сказали браузеру интерпретировать документ как UTF-8, а не как Windows-1256, но действительно ли вы изменили используемую кодировку с Windows-1256 на UTF-8?

Например,

$ cat a.pl
use strict;
use warnings;
use feature qw( say );
use charnames ':full';

my $enc = $ARGV[0] or die;
binmode STDOUT, ":encoding($enc)";

print <<"__EOI__";
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=$enc">
<title>Foo!</title>
</head>
<body dir="rtl">
\N{ARABIC LETTER ALEF}\N{ARABIC LETTER LAM}\N{ARABIC LETTER AIN}\N{ARABIC LETTER REH}\N{ARABIC LETTER BEH}\N{ARABIC LETTER YEH}\N{ARABIC LETTER TEH MARBUTA}
</body>
</html>
__EOI__

$ perl a.pl UTF-8 > utf8.html

$ perl a.pl Windows-1256 > cp1256.html
0 голосов
/ 23 марта 2013

чтобы правильно отображать арабские символы, вам нужно конвертировать ваш php файл в utf-8 без Bom это случилось со мной, арабские символы отображались бриллиантами, но переход на utf-8 без бомбы решит эту проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...