web-dev-qa-db-ja.com

PHP:UTF-8文字列をAnsiに変換しますか?

DBにある値からcsv文字列を作成します。最終的な文字列は$ csv変数に保存されます。

今、私はこの文字列をダウンロード用に提供しています:

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=whatever.csv");
header("Pragma: no-cache");
header("Expires: 0");

echo $csv;

たとえば、これをNotepad ++で開くと、Ansi as UTF-8と表示されます。どうすればそれをAnsiだけに変更できますか?

私は試した:

$csv = iconv("ISO-8859-1", "WINDOWS-1252", $csv);

それは何も変わりませんでした。

ありがとう!

解決策: $ csv = iconv( "UTF-8"、 "WINDOWS-1252"、$ csv);

6
user1856596

試してください:

$csv = iconv("UTF-8", "Windows-1252", $csv);

ただし、ANSIはUTF-8の小さなサブセットしかエンコードできないため、最終的にはデータが失われます。それほど強い理由がない場合は、UTF-8でエンコードされたファイルを提供してください。

20

あなたの質問にはISO-8859-1、Windows-1252、ANSIについて誤解があるので、ここで注意すべき重要なことは次のとおりです。

いわゆるWindows文字セット(正確には、WinLatin1、またはWindowsコードページ1252)は、印刷可能な文字にこれらの位置の一部を使用します。したがって、Windowsの文字セットはISO8859-1と同一ではありません。 Windowsの文字セットは「ANSI文字セット」と呼ばれることがよくありますが、これは非常に誤解を招く恐れがあります。 ANSIによって承認されていません。

歴史的背景:マイクロソフトは、ANSI規格のドラフトに基づいてセットの設計を行いました。 A Microsoftによる用語集はこれを明示的に認めています

その他のリソース: ここ および ここ

したがって、この質問に終わる他の人々のための参考までに。

これに関するMSの正確な説明は次のとおりです。

Windowsコードページを表すために使用される「ANSI」という用語は歴史的な参照ですが、今日ではWindowsコミュニティで存続している誤った名称です。これの原因は、Windowsコードページ1252が元々ANSIドラフトに基づいていたという事実にあります。これは、国際標準化機構(ISO)標準8859-1になりました。 「ANSIアプリケーション」は通常、非Unicodeまたはコードページベースのアプリケーションへの参照です。

5
Borislav Sabev

特殊文字を変換するときのデータ損失を回避するには:

setlocale(LC_CTYPE, "fr_FR.UTF-8"); //set your own locale
$csv = iconv("UTF-8", "WINDOWS-1252//TRANSLIT//IGNORE", $csv);
0
Zebx