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