LinuxとWindowsの.txtファイルの違いは何ですか(Unicodeエンコーディング)

元のANSI規格で定義されている128文字セットのみを使用しています。

しかし、全体としてファイルはどのように異なる方法で含意されていますか。

表示には関係ありません。つまり、タブが6文字または8文字で表示されていて、メモリ内の実際の内部表現が表示されている場合

私が聞いた違いの1つは、\ r \ n(Windows)と\ n(\ n)の行末処理の使用です。

14
あなたのGnu/Linuxボックスに爆弾があるかどうかを確認してください。これはDebian(および少なくとも他のいくつかのもの)の一部ですが、インストールが必要かもしれません。 Microsoftが誤ってBOMをutf-8ファイルの先頭に追加しているためです。
追加された 著者 ctrl-alt-delor,
私は私がwindowsからlinuxに転送した私のphpファイルのバイトオーダーマークが私の#!(最初の行)を殺していると思います。ファイル全体は機能しますが、本来のインタプリタを見つけることができません。メモ帳でエンコード方法を選択してANSIで確実にエンコードするようにした場合、それは本当のASCIIなのか、それともWindowsが他のことをするのか
追加された 著者 user73919,

5 答え

Windows上の "Unicode"はUTF-16LEで、各文字は2または4バイトです。 LinuxはUTF-8を使用し、各文字は1から4バイトの間です。

「すべてのソフトウェア開発者にとって絶対に最低限、絶対にUnicodeと文字セットについて知っておく必要があります(言い訳は不要です)」

17
追加された
Windowsは内部でUTF-16を使用しますが、.txtファイルはめったに使用しません。それらは通常UTF-8またはwindows-125xのどちらかです。
追加された 著者 GabrielC,
それは記事の中で特にそれと呼ばれていません。その代わりに、それは "ローエンディアン"(または我々がそれを呼ぶように "リトルエンディアン")について語っています。
追加された 著者 juan9793,
Latin-1以外のものを使用していないのであれば、はい。
追加された 著者 juan9793,
それらは私がリンクした記事の中にあります。
追加された 著者 juan9793,
それどころか。 UTF-8はWindowsではそれほど一般的ではありません。 「Unicode」(詳細な説明なし)として保存するすべてのツールはUTF-16LEを使用します。
追加された 著者 juan9793,
@MadNik:それはあなたが使っているエンコーディングによって異なります。
追加された 著者 juan9793,
だいたい。存在する場合は、 BOM も数える必要があります。
追加された 著者 juan9793,
エンコーディングの違いと改行の違いに基づいて、ファイルに2行の英語の文字( a b )があると、Unixは4バイト、Windowsは8バイトになります。これを格納するためのメモリの?
追加された 著者 RedSonja,
私はポイントを得たと思います。私は私がunixとwindowsの両方でutf-8を使うことにしたならば、私にそれを頼むかもしれません。違いの数を表すのは改行だけで、同じ例では、unixは4バイト、windowsは6バイトです。改行で区切られ、1GBのメモリを埋めるために保存されるutf-8でエンコードされた単一文字の単語の可能な数を数えているなら、その行は区別因子を壊していますか?
追加された 著者 RedSonja,
UTF-16LEを検索しましたが、記事中に見つかりませんでした。
追加された 著者 user73919,
Windowsは1バイトを無駄にしますか?
追加された 著者 user73919,

改行

WindowsはCRLF( \ r \ n 0D 0A )の行末を使いますが、UnixはLF( \ n 0A )。

文字コード

Most modern (i.e., since 2004 or so) Unix-like systems make UTF-8 the default 文字コード.

しかし、WindowsはUTF-8のネイティブサポートを欠いています。これは内部的にはUTF-16で動作し、 char ベースの文字列は旧来のものであると仮定しています">コードページ幸い、メモ帳はUTF-8ファイルを読むことができます。残念ながら、 "ANSI"エンコーディングはまだデフォルトです

問題のある特殊文字

U + 001A

Windowsでは、ファイルの終わり文字として Ctrl + Z を使用することはめったにありません。たとえば、コマンドプロンプトでファイルを入力した場合、最初の 1A バイトで切り捨てられます。

Unixでは、 Ctrl + Z は特別なことではありません。

U + FEFFゼロの切れ目のないスペース(バイトオーダーマーク)

Windowsでは、UTF-8ファイルは、ANSIファイルと区別するために「バイトオーダーマーク」 EF BB BF で始まることがよくあります。

Linuxでは、BOMは推奨されません。シェルスクリプトのshebang行のようなものを壊すからです。それにもかかわらず、UTF-8がデフォルトのエンコーディングである場合は、UTF-8署名を付けるのは無意味です。

9
追加された
Ctrl-Zは、Linux上でCtrl-D(または stty を使ってEOFにバインドした文字)と同じように、ウィンドウ上で機能します。コンソールドライバはそれをファイルの終わりに変換します。リテラル文字は入力ストリームには現れません。 read()が0を返すようにするだけです。
追加された 著者 guyumu,
メモ帳などのプログラムにはまだ表示されていますが、疑似用語の「ANSIコードページ」は完全に誤称であり、Microsoftはこれをずっと前に認めています。詳しくは ja.wikipedia.org/wiki/Windows_code_page をご覧ください。
追加された 著者 hummingBird,
utf-8にはBOMはありませんが、MS-WindowsにはBOMが挿入されています。真実ではないことutf-8。 utf-8の規則の1つは、asciiで表すことができるファイルはすべて、utf-8と少し同じであるということです。また、ストリームのどこからでもutf-8を読み始めることができます。
追加された 著者 ctrl-alt-delor,
私は私がwindowsからlinuxに転送した私のphpファイルのバイトオーダーマークが私の#!(最初の行)を殺していると思います。ファイル全体は機能しますが、本来のインタプリタを見つけることができません。メモ帳でエンコード方法を選択してANSIで確実にエンコードするようにした場合、それは本当のASCIIなのか、それともWindowsで何か他のことをするのですか?
追加された 著者 user73919,

違いは、\ r \ n(Windows)と\ n(\ n)の併用です(

)。

はい。ほとんどのUNIXテキストエディタはこれを自動的に処理しますが、Windowsプログラマエディタはこれを処理しますが、一般的なテキストエディタ(ベースメモ帳)は処理しません。

Windowsは END OF FILEとしてEOF(Ctrl-Z)も必要とするようです一部のコンテキストではですが、UNIXではおそらく表示されないでしょう。

MacOS Xは現在UNIXの下にあるので、UNIXの行末を使用することを忘れないでください。 OS X(MacOS 9以前)以前では、独自のエンディングがありました(\ r)

編集:他のフォーマットのCRとLFで:

  • \ nはASCII 0x0A、改行(LF)です。
  • \ rはASCII 0x0D、キャリッジリターン(CR)です。
3
追加された
@ barlop、それは私が言っていることです:それは文字を返しません。 read()はバッファに格納したバイト数を返します。 EOFでは、単に0バイトになります。それはあなたがファイルの終わりに達したこと、そしてそれ以上読むものがないことの合図です。
追加された 著者 guyumu,
この制御キーが無効にされていない限り、@ barlop、端末はキーストローク(unixシステムでは通常ctrl-d)をEOFに変換します。アプリケーションは、実際にヒットしたキーではなくEOFを読み取ります。つまり、 read()は特定の文字の代わりにゼロバイトを返します。
追加された 著者 guyumu,
いいえ、EOFはASCII文字ではありません。 EOFは通常、(0を返し、バッファに何も書き込まないで)バンド外で通知されますが、古いDOSルーチンの中には、バンド内のEOFを通知するために0xFF/-1を使用するものがありました。
追加された 著者 guyumu,
@psusiどのようなASCII文字がプログラムに返されますか? EOFはasciitable.comにはありません
追加された 著者 barlop,
ユーザーに。 ja.wikipedia.org/wiki/Control-Z "および@psusiシステム(DOSやcmd/win32コンソールなど)では、ファイルの終わりを知らせるためにControl + Zが使われているので、EOF文字として知られています。 con aa を押すとctrl-zを使って終了したことを知らせることができます。ファイルの終わりのように見えます。^ Z(アルファベットの26文字目はzです)。 SUBのように見えます。このリスティングが asciitable.com に表示されていないため、ほとんどの人がしているとは限りません。
追加された 著者 barlop,
@Chris \ nはASCII 0x0A、改行です。 \ rはASCII 0x0D、改行です
追加された 著者 KevinD,
リンクされたウィキペディアの記事のとおり、WindowsとDOSはファイルの終了に0x1Aを必要としません
追加された 著者 phuclv,
DosはCP/Mに基づいており、CP/Mファイルサイズはブロック単位でした。そのため、テキストファイルは control z で終わり、ブロックの終了前に終了したことを示します。それは時々Microsoftsウィンドウズ上で生きます、しかしDOSでさえ決して必要とされませんでした。
追加された 著者 ctrl-alt-delor,
ASCII文字セットのどこに\ r \ nと\ nがありますか。 ja.wikipedia.org/wiki/File:ASCII_Code_Chart.svg
追加された 著者 user73919,
LFとCRありがとう。
追加された 著者 user73919,
@リッチEOFはどうですか?これはANSI文字ですか?
追加された 著者 user73919,
ASCII文字のSUBのようです。
追加された 著者 user73919,

LinuxはUTF-8を使用し、各文字は1から4バイトではなく、1から6バイトです。

U00000000 - U0000007F: 0xxxxxxx
U00000080 - U000007FF: 110xxxxx 10xxxxxx
U00000800 - U0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U00010000 - U001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U00200000 - U03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U04000000 - U7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1
追加された
これは、2011年に提出された回答ですでに述べられています。
追加された 著者 Johan Leino,

使用されているUnicodeエンコードはOSベースではありません。

Windowsのnotepad.exeでもオプションがリストされています - (メモ帳の意味を括弧で囲みます) ANSI(Unicode以外)、Unicode(メモ帳はUnicode LEを意味します)、Unicodeビッグエンディアン(BE)、UTF-8

ANSIはそれが非常に限られた数の文字を含むユニコードではないのでそれを脇に置いてみましょう。

しかし、メモ帳でもLE、BE、またはUTF-8を実行できることを確認してください。

そしてメモ帳は別にして、UTF-8はBOMの有無にかかわらずある場合もあります。

そして私はWindowsをCygwinと一緒に使いますが、Windowsのポートはあなたが指定したとしてもうまくいくでしょう。

特定のOSがどのUnicodeエンコーディングを使用するかについての規則はありません。あるとすれば、それほど柔軟なOSではないでしょう。

違いが本当にソフトウェアを知っているのを見るために、ソフトウェアの一部を使用することまたは提供すること。

Cygwinとxxd、あるいは16進エディタを入手して、ファイルの中身を見てください。ファイルを識別しやすくするために 'file'コマンドを使用してください。それで、あなたは実際にUTF 16bit LEが何であるかを見ます。 UTF 16bit BEとは何ですか。 UTF-8とは何ですか(UTF-8はBOMの有無にかかわらず)。

時々あなたはユニコードとして保存するようにメモ帳に指示することができます(それによって、メモ帳はユニコード16ビットリトルエンディアンを意味します)、そしてそれはしません。しかし、arial unicodeのようなunicodeフォントを選び、charmapからいくつかのunicode文字をコピーすればそれができます。

C:\asdf>notepad.exe a.a

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>type a.a
aaa慡ൡ <-- though displayed aaa followed by some boxes in my cmd window
C:\asdf>

C:\asdf>xxd a.a
0000000: fffe 6100 6100 6100 6161 610d            ..a.a.a.aaa.

C:\asdf>

^^ The portion of the byte that stores the 61 is the lower value portion which with LE is stored first.

ddコマンド(私はウィンドウズの中でcygwinから走る* nixコマンド)はそれを切り替えることができます

C:\asdf>xxd -p a.a
fffe6100610061006161610d

C:\asdf>file a.a
a.a; Little-endian UTF-16 Unicode text, with no line terminators

C:\asdf>dd if=a.a conv=swab of=a.a2
0+1 records in
0+1 records out
12 bytes (12 B) copied, 0 seconds, Infinity B/s

C:\asdf>type a.a2
a  a a aaa
C:\asdf>xxd -p a.a2
feff00610061006161610d61

C:\asdf>file a.a2
a.a2; Big-endian UTF-16 Unicode text, with no line terminators

C:\asdf>

そしてメモ帳自体はUTF-16ビッグエンディアンまたはUTF-16リトルエンディアンまたはUTF-8として保存できます

enter image description here

あなたが技術者、あるいは単なるメモ帳ユーザーであるならば、あなたはあなたのOSのために一つのエンコーディングに縛られていません!

私はUTF-8がUTF-16よりも理にかなっていると思います、UTF-16は8ビットしか必要としない文字に対しても16ビットを使用します。また、charmapはUTF-16コードを示していることにも注意してください。

Sublime(Windowsテキストエディタ)はデフォルトでUnicodeをUTF-8として保存します。

私はWindowsを使い、時にはUnicodeを使いますが、私はほとんどUTF-8を使っています。

そして、Windowsは技術的に柔軟なので、Linuxも少なくとも技術的に柔軟です。

1
追加された
@Vesnog xxdもファイルを書き込むことができます。 echo 61 | xxd-r -p> aa 次に type aa を試してみてください。実際にxxd -pを使用してバイトダンプを取得し、バイトを並べ替えたり変更してからxxd -r -pを実行して、古いデータに基づいて異なるエンコードまたは異なるデータを使用して新しい別のファイルを取得します。 "file"コマンドはバイトに基づいてエンコーディングを考え出しています。
追加された 著者 barlop,
@Vesnog隣接するバイトを交換しますが、各バイト内のビットは交換しません。あなたはあなた自身の質問の一部の答えをしています。 「ddコマンドはビットを交換することによってエンコードをどのように変更するのですか」と尋ねます。実際、ddは隣接するバイトの各ペアを交換することによってエンコードを変更します。したがって、1バイトが00で次のバイトが61の場合は、そのペアを交換します。 2バイトの各セットが並べ替えられます。エンコーディングはハードコーディングされていませんが、1ビット1バイト1バイトの順番は「ハードコーディング」されています。ddコマンドはそれを読み込んで新しいファイルを書き込みます。 xxdは本当にファイルにあるものを示しています、そしてあなたはそれからエンコーディングを理解することができます
追加された 著者 barlop,
@Vesnogあなたはcygwinの内側またはcygwinの外側でcygwinコマンドを実行することができます。あなたがそれらをcygwinの外で走らせるならば、 c:\ cygwin \ bin (それがcygwinのbinサブディレクトリがあるところであれば)をあなたのパスに追加してください。また、 'type'や 'dir'などの内部cmdコマンド、またはcalc.exe(windows calculator)などの外部exeもcygwin内から実行/起動できます。 cygwinから実行できるものはほとんど何でもcmdから実行でき、その逆も可能です。 bashを使いたいのであればcygwinを使い、一重引用符と二重引用符で問題が発生した場合はcygwin内でcygwinコマンドを実行し、cmd内でcmdのコマンドを実行してください。
追加された 著者 barlop,
@Vesnog type はcmd.exeに組み込まれている標準的なコマンドです xxd は、デフォルトではcygwinと一緒にインストールされませんが、cygwinをインストールしたとき、またはcygwinを起動した後セットアップあなたはcygwinで使用するためにインストールすることができるコマンドの長いリストを手に入れ、そしてちょうどcygwinセットアップ検索ボックスにxxdをタイプすればそれが現れます。 xxdはvim7のインストール後からも入手できるので、そこから入手することもできます。
追加された 著者 barlop,
例を再現することができましたが、それでも質問があります。 dd コマンドはビットを交換することによってエンコーディングをどのように変更しますか。また、エンコーディングは常にファイルにハードコードされており、 xxd によって得られるような16進ダンプで読み取ることができますか?
追加された 著者 Vesnog,
Cygwinプロンプト内に file type というコマンドを書きましたか?
追加された 著者 Vesnog,
xxd type のコマンドがCygwinの標準インストールに欠けていると思います。それとは別に、私はあなたの結果を再現したいと思います。
追加された 著者 Vesnog,