PHP - UTF-8 на китайский ANSI (GB2312?) - экспорт файла CSV

Я публикую это после нескольких часов исследований (несколько раз...). Я не мог найти никакого ответа еще.

Моя цель - написать файл CSV с использованием PHP. Этот файл должен иметь китайскую кодировку ANSI (я полагаю, это GB2312 для упрощенного китайского, в notepad++ я вижу только кодировку ANSI). Это необходимо импортировать в другой инструмент.

[Важная заметка]

В настоящее время мы конвертируем файл с помощью notepad++ и компьютера с китайским языком по умолчанию. Процесс такой:

  • получить UTF8 CSV из веб-приложения
  • сохранить как csv с Excel 2003 на китайском ПК
  • откройте в notepad++, кодировка уже ANSI, удалите один ведущий "?" в начале файла.

Я запустил тест: измените мой файл.csv на.php и замените его следующим кодом, чтобы сохранить ту же кодировку:

<?php echo mb_detect_encoding("test"); ?>

Это напечатает: "ASCII".

Тогда я не уверен, что должно быть на выходе моего CSV: GB2312?, ASCII?, ANSI?. Мне даже не ясно, чем они отличаются.

Я также прочитал, что файл, сохраненный в Excel 2007 как CSV с китайским ПК, подходит для этого инструмента.

[/Важная заметка]

В настоящее время мне не удается понять это правильно! Когда я открываю файл, который попадаю в notepad++, он по-прежнему показывает кодировку в кодировке UTF-8. И это очевидно, потому что китайские иероглифы выглядят красиво, они должны выглядеть "разбитыми":-).

Я использую следующие условия заголовка:

header("Content-type: text/csv; charset=GB2312");
header("Content-Disposition: attachment; filename=$filename.csv");
header("Content-Transfer-Encoding: binary"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
header("Expires: 0");

[Дополнительная информация]

Кодируется мой файл (я сделал его абстрактным, чтобы было проще)

//header, hard coded in Chinese
$csv = "东西,东西,东西\n"; //example "stuff,stuff,stuff"
[...]
//write line by line, status is also hard coded (行)
$csv .= $DB_data_1.",".$DB_data_2.",行\n"; //行=OK

[/Дополнительная информация]

Я также конвертирую строку CSV в GB2312 с помощью iconv перед печатью (также попробовал mb_convert_encoding)

setlocale(LC_ALL,'zh_CN');
$csv = iconv("UTF-8","GB2312",$csv);
echo($csv);

Мой файл.php написан в кодировке UTF-8 (не UTF-8 без спецификации)

По сути, я всегда получаю файл UTF-8 в качестве вывода, мне нужен ANSI. Похоже, что есть так много параметров / атрибутов, и я не понимаю это правильно. Ваша помощь будет принята с благодарностью!

Спасибо!

Дэвид

[Дополнительная информация]

Как пример, на столбцах моего заголовка будет иметь следующее изменение кодировки:

  • в исходном коде PHP (файл UTF-8, компьютер на английском языке): 商品序号 (имеется в виду: SKU, код товара)
  • в окончательном файле CSV (файл ANSI, компьютер на английском языке):
  • в конечном файле CSV (файл ANSI, китайский компьютер): 商品 序号

[/Дополнительная информация]

2 ответа

строка mb_convert_encoding (строка $str, строка $to_encoding [, смешанная $from_encoding ])

Обратите внимание, что вторым параметром является кодировка. Так и должно быть

$csv = mb_convert_encoding($csv, "GB2312", "UTF-8");

Заголовки HTTP, которые вы отправляете, указывают только клиенту, в какой кодировке вы отвечаете - он не конвертирует контент для вас. Так что, если вы укажете charset=GB2312, но отправь utf8, ты просто врешь. В любом случае, атрибут charset здесь не имеет никакого смысла, так как контент все равно передается в двоичном виде.

Что вам нужно сделать, это конвертировать контент перед отправкой. Iconv или mbstring являются подходящими инструментами для этого. Для начала убедитесь, что вы знаете, в какую кодировку поступают ваши данные. Предположительно, они загружаются откуда-то (например, из базы данных). Итак, учитывая, что вы немного растерялись, есть хороший шанс, что это не то, что вы думаете. Например, это может быть iso-8859-1, а не utf-8.

Если вы уверены, что это действительно utf-8, используйте iconv, как вы уже пробовали:

$csv = iconv('UTF-8', 'GB2312', $csv);

При условии, что $csv строка, содержащая файл csv

Другие вопросы по тегам