0

UTF-8との互換性を維持しながら、エンコードが不明なアップロードされたファイル名をWindows-1252に変換する必要があります。

これらのファイルをコントローラー(影響力はありません)に渡すとき、ファイルはWindows-1252でエンコードされている必要があります。次に、このコントローラーは、MySQLを介してデータベースに保存される有効なファイル(名前)のリストを再度生成します。したがって、UTF-8との互換性が必要です。コントローラに渡されるファイル名とデータベースに書き込まれるファイル名は一致する必要があります。ここまでは順調ですね。

まれに、「Windows-1252」に変換する場合(文字「ï」など)、UTF-8では文字が無効なものに変換されます。次に、MySQLはそれらの無効な文字を削除します。その結果、ディスク上のファイル名とデータベースに保存されているファイル名は一致しなくなります。時々失敗するこの変換は、単純な再コーディングで達成されます。

$sEncoding       = mb_detect_encoding($sOriginalFilename);
$sTargetFilename = iconv($sEncoding, "Windows-1252//IGNORE", $sOriginalFilename);

変換によって無効な文字が生成されるのを防ぐために、再コード化された文字列からすべての無効なUTF-8文字を再度削除できます。

ini_set('mbstring.substitute_character', "none");
$sEncoding       = mb_detect_encoding($sOriginalFilename);
$sTargetFilename = iconv($sEncoding, "Windows-1252//TRANSLIT", $sOriginalFilename);
$sTargetFilename = mb_convert_encoding($sTargetFilename, 'UTF-8', 'Windows-1252');

ただし、これにより、文字列に残っている特殊文字が完全に削除/再コード化されます。たとえば、ドイツ語ではかなり規則的な「äöüÄÖÜ」などをすべて失います。

(有効な特殊文字を失うことなく)Windows-1252にエンコードするためのよりクリーンで簡単な方法をご存知の場合は、お知らせください。

どんな助けでも大歓迎です。前もって感謝します!

4

3 に答える 3

3

文字列を同時にWindows-1252とUTF-8にすることはできません。文字セットは最初の128文字で同じです(たとえば、基本ラテンアルファベットが含まれています)が、それを超えると(ウムラウトのように)、どちらか一方になります。UTF-8には、Windows-1252とは異なるコードポイントがあります。

于 2013-03-15T10:31:24.257 に答える
3

主な問題は、mb_detect_encoding()があなたが思っていることを正確に実行しないことだと思います。文字エンコードを検出しようとしますが、事前定義されたエンコードのかなり限られたリストから検出します。デフォルトでは、これらのエンコーディングはmb_detect_order()によって返されるものです。私のコンピューターでは、それらは次のとおりです。

  • ASCII
  • UTF-8

したがって、候補エンコーディングのリストをコンパイルして関数にフィードする必要がない限り、この関数はまったく役に立ちません。

さらに、エンコーディングの小さなサブセットに制限したとしても、基本的に任意の入力文字列のエンコーディングを推測する信頼できる方法はありません。あなたの場合、Windows-1252は非常に近く、 ¤ISO-8859-1ISO-8859-15€などの主要な文字を視覚的に検査する以外に、それらを区別する方法はありません。

于 2013-03-15T10:44:15.067 に答える
1

ファイルシステムでASCIIを維持する-ファイル名でASCII以外の文字を維持する必要がある場合は、ASCIIを維持しながらUnicode文字を表すために使用できるスキームがあります。

たとえば、パーセントエンコーディング:

äöüÄÖÜ.txt<->%C3%A4%C3%B6%C3%BC%C3%84%C3%96%C3%9C.txt

もちろん、これはファイル名の制限にかなり早く到達し、あまり最適ではありません。

punycodeはどうですか?

äöüÄÖÜ.txt<->xn--4caa7cb2ac.txt

于 2013-03-15T11:19:21.030 に答える