私は次のようにしてkotlin(kotlin Int型)からファイルに整数値を書き込みます
var1BufferedWriter?.write(String.format("%d\n", intvar ) )
var2BufferedWriter?.write(String.format("%08x\n", intvar ) )
var1
textfile.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 に近くなくなるため、おそらく問題は発生しません。)