Кодирование текстовых полей MySQL в текстовые файлы UTF-8 - проблемы со специальными символами - PullRequest
2 голосов
/ 20 апреля 2010

Я пишу php-скрипт для экспорта строк базы данных MySQL в файл .txt, отформатированный для внутренней разметки Adobe InDesign.

Экспортирует работу, но когда я сталкиваюсь со специальными символами, такими как é или umlauts, я получаю странные символы (например, Chloë Hanslip вместо Chloë Hanslip). Вместо того, чтобы выполнять поиск и замену для каждого возможного странного символа, мне нужен лучший метод.

Я проверил, что когда текст попадает в базу данных, он правильно сохраняется - в базе данных я вижу специальные символы. Мой код экспорта в основном выполняет некоторые регулярные выражения для вставки тегов кода InDesign, и у меня остаются странные символы. Если я просто выводю текст в браузер (а не запрашиваю загрузку текстового файла), он отображается правильно. Когда я сохраняю файл, я использую этот код:

header("Content-disposition: attachment; filename=test.txt");

header("Content-Type: text/plain; charset=utf-8");

Я пробовал различные комбинации utf8_encode() и iconv() безрезультатно. Кто-нибудь может указать мне правильное направление здесь?

Ответы [ 5 ]

4 голосов
/ 20 апреля 2010

InDesign не сможет использовать любую кодировку, указанную в заголовке. (Он даже не увидит его, поскольку он не сохраняется при сохранении на диск в Windows.) Вместо этого вы должны явно указать ему кодировку в отдельном специальном теге в начале файла, например:

<ANSI-WIN>

К сожалению, не использует стандартные имена кодировок , и в InDesign нет тега, который вообще соответствует кодировке UTF-8. Единственный тег кодировки, который вы можете использовать, который позволит вам включить любой символ, который вам нравится:

<UNICODE-WIN>

, что соответствует UTF-16 (little-endian with BOM), с окончаниями строки Windows CRLF. (Единственный другой вариант окончания строки - это MAC, который вам совсем не нужен, так как это старые Mac OS до OSX, где символом окончания строки был CR.)

Итак, учитывая строку $ s UTF-8, включающую последовательности байтов UTF-8, которые вы извлекли из базы данных, и простые (Unix-Linux-OSX-web-style) переводы строк LF, вы должны написать это так :

$s= "<UNICODE-WIN>\r\n".str_replace("\n", "\r\n", $s);
echo iconv('UTF-8', 'UTF-16', $s);

(Обеспечение отсутствия вывода любых пробелов до или после, потому что это нарушит кодировку UTF-16.

2 голосов
/ 20 апреля 2010

Перед экспортом вы можете использовать команду SET NAMES для изменения кодировки передачи, например:

SET NAMES utf8;

Вы можете настроить это в своем программном обеспечении для резервного копирования mysql.

1 голос
/ 26 марта 2011

затем преобразование в UTF-16 - в результате файл, который мой текстовый редактор отображал исключительно в виде квадратов,

iconv не может добавлять байты спецификации \ xff \ xfe, которые должны быть помещены в начало файла Unicode.

Попробуйте это: $ out = "\ xff \ xfe". Iconv ( 'UTF-8', 'UTF-16LE', $ вне);

1 голос
/ 20 апреля 2010

Похоже, что строка ISO-8859-1 отправляется как UTF-8 ...

Убедитесь, что ваши таблица и поля находятся в UTF-8 и подключаются к базе данных также в UTF-8.Если ваша таблица и поля находятся в UTF-8, и вы не указываете кодировку MySQL, MySQL на лету преобразует данные в ISO-8859-1 (latin1) - это конфигурация по умолчанию для всех хостов, которые я использовал, поэтомудалеко ...

Это способ, которым я пользуюсь для этого (обратно совместимый с PHP 5.2.2 и ниже):

$conn = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('dbname');
if (mysql_errno())
{
    //Handle database connection error here
}

if (function_exists('mysql_set_charset'))
    mysql_set_charset('utf8', $conn); //PHP 5.2.3+ only
else
{
    if (mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $conn) === false)
    {
        //Unable to set database charset! Handle error here...
    }
}
1 голос
/ 20 апреля 2010

просто вызов в PHP после методов подключения к БД mysql_set_charset('utf8');

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