Кодировка арабского символа: UTF-8 по сравнению с Windows-1256

Quick Background : Я унаследовал большой файл дампа 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»

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

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

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

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

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

Вы сказали браузеру интерпретировать документ как 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 

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

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

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

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

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

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