メモ帳で txt ファイルのコンテンツが奇妙な記号として表示される

メモ帳で txt ファイルのコンテンツが奇妙な記号として表示される

私は次のようにしてkotlin(kotlin Int型)からファイルに整数値を書き込みます

var1BufferedWriter?.write(String.format("%d\n", intvar ) )   
var2BufferedWriter?.write(String.format("%08x\n", intvar ) )    

var1textfile.txt上記はとvar2に書き込まれますtextfile_hex.txt。両方とも Android 携帯の SD カード メモリに保存されます。これらを Windows PC にコピーしてメモ帳で開くと、textfile.txt は次のようになります。

ここに画像の説明を入力してください

textfile_hex.txt は次のようになります。

ここに画像の説明を入力してください

textfile.txt を 16 進エディターで開くと、ファイル内のすべてのデータが正しく、期待どおりの内容であることがわかります。Notepad++ でもすべてが正しく表示されます。奇妙なのは、週末前にこの同じアプリを使用して textfile.txt に似た他の多くのファイルを生成したのですが、それらはすべて Windows で正常に表示されました。Android やメモ帳の設定は何も変更されていません。

これは正常な動作ですか? これは何らかのエンコードの問題ですか? メモ帳で一部の txt ファイルが正しく表示され、他のファイルは表示されないのはなぜですか?

Windows バージョン:
エディション Windows 10 Pro
バージョン 22H2
OS ビルド 19045.4046
エクスペリエンス Windows Feature Experience Pack 1000.19053.1000.0

答え1

このファイルは偽陽性メモ帳の「Unicodeかどうか」の検出で問題が発生します。(この問題は独自のWikipediaページ

  • 'intvar' が常にゼロの場合、ファイルは完全に繰り返しで構成され、 ASCII (および/または UTF-8) の"0\n"バイトとして保存されます。{0x30, 0x0A}

    "0"  "\n"  "0"  "\n"  "0"  "\n"  ...
    30   0A    30   0A    30   0A    ...
    
  • ご覧のとおり、Unicode文字"ਰ"aka "\u0A30"aka0A30 は、これはまた{0x30, 0x0A}UTF-16 LE のバイトとして保存されます。

    "ਰ"     "ਰ"     "ਰ"    ...
    30 0A   30 0A   30 0A  ...
    

出力を少し変更する(たとえば、何らかの「明らかに ASCII」のヘッダーやコメントを追加する)と、問題を回避できます。

ファイルの内容にプレフィックス"\xEF\xBB\xBF"(または"\uFEFF"、Java/Kotlin が推奨するスペル) を付けることもできます。これは、ファイルが UTF-8 であることを示す標準ヘッダーであり、メモ帳 (および他のすべてのテキスト エディター) が自動検出をスキップするようになります。

Androidがサポートしている場合は、次のようにファイルを書き込むことができます。実際のUTF-16 (フォーマット検出のこの部分をバイパスできるように、BOM を含めることが望ましい)。

(他のファイルでは、少なくとも 1 つの値が 10 以上のため、バイトが「ずれて」検出コードに対して ASCII に近くなり、UTF-16 に近くなくなるため、おそらく問題は発生しません。)

関連情報