web-dev-qa-db-ja.com

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

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

しかし、全体として、ファイルの処理方法は異なります。

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

私が聞いた1つの違いは、\ r\n(Windows)と\ nの使用(ライン終端(Linux))です。

16
user73919

Windowsの「Unicode」はUTF-16LEで、各文字は2または4バイトです。 LinuxはUTF-8を使用し、各文字は1〜4バイトです。

"すべてのソフトウェア開発者の絶対的な最小値は、絶対に、確実にUnicodeと文字セットについて知っておく必要があります(言い訳なし!)"

改行

WindowsはCRLF(\r\n0D 0A)の行末を使用しますが、UnixはLF(\n0A)のみを使用します。

文字コード

最も最近の(つまり、2004年以降)Unixのようなシステムでは、 TF-8 がデフォルトの文字エンコーディングになります。

ただし、WindowsにはUTF-8のネイティブサポートがありません。内部的にはUTF-16で動作し、charベースの文字列がレガシー コードページ にあると想定しています。幸い、メモ帳はUTF-8ファイルを読み取ることができます。残念ながら、「ANSI」エンコーディングはstillがデフォルトです。

問題のある特殊文字

U + 001A置換

Windowsは(まれに)使用します Ctrl+Z ファイル終了文字として。たとえば、コマンドプロンプトでファイルをtypeした場合、最初の1Aバイトで切り捨てられます。

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

ブレークなしスペース付きU + FEFFゼロ(バイト順マーク)

Windowsでは、UTF-8ファイルは多くの場合、「バイトオーダーマーク」EF BB BFで始まり、ANSIファイルと区別されます。

Linuxでは、BOMはシェルスクリプトのシバン行のようなものを壊すのでお勧めできません。さらに、UTF-8がデフォルトのエンコーディングである場合でも、UTF-8署名を使用しても意味がありません。

12
user46971

私が聞いた1つの違いは、改行(Linux)に対する\ r\n(Windows)と\ nの使用です。

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

WindowsではEOF(Ctrl-Z)as END OF FILE が必要なコンテキストもありますが、UNIXでは見られないでしょう。

MacOS Xは現在UNIXの下にあるため、UNIXの行末を使用することに注意してください。 OS X(MacOS 9以前)以前は独自の末尾がありました(\ r)

編集:他の形式のCRおよびLF:

  • \ n is ASCII 0x0A、Line Feed(LF)
  • \ r is ASCII 0x0D、キャリッジリターン(CR)
3
Rich Homolka

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

Windowsのnotepad.exeにもリストされているオプションがあります-(メモ帳が意味するものを括弧で囲みます)ANSI(ユニコードではない)、Unicode(メモ帳はUnicode LEを意味します)、Unicode Big Endian(BE)、UTF-8

ANSIはユニコードではなく、非常に限られた数の文字しか含まないため、脇に置いておきましょう。

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

また、メモ帳は別として、UTF-8はBOMがあってもなくてもかまいません。

私はWindowsをCygwinで使用していますが、Windowsのポートは\ r\nを指定してもうまくいく可能性があります\ n sedがそれを実行するのを見てきました。

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

違いを実際に確認するには、ソフトウェア、ソフトウェアのエンコードが使用または提供するものを知っています。

Cygwinとxxd、および/または16進エディターを入手し、ファイル内に実際にあるものを調べます。 'file'コマンドを使用して、ファイルを識別します。次に、実際にはUTF 16ビットLEが何であるかがわかります。 UTF 16bit BEとは何か。 UTF-8とは(およびUTF-8はBOMの有無にかかわらず).

場合によっては、メモ帳にユニコードとして保存するように指示できます(これにより、メモ帳はユニコードの16ビットリトルエンディアンを意味します)。しかし、Arial UnicodeのようなUnicodeフォントを選択し、charmapからいくつかのUnicode文字をコピーすると、メモ帳やソフトウェアが実行していることを確認するための良い方法は、ファイルの16進数を調べることです。

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コマンド(Windows内で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のために1つのエンコーディングに縛られていません!

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

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

私はWindowsを使用し、時にはunicodeを使用していますが、主にUTF-8を使用しています。

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

1
barlop