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


16

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

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

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

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


バイトオーダーマークは、WindowsからLinuxに転送したphpファイルの#!(最初の行)を殺していると思います。ファイル全体は機能しますが、インタープリターを見つけることができません。メモ帳でエンコード方法を選択してANSIでエンコードすることを特に確認した場合、それは真のASCIIであるか、Windowsは何か他のことを行うか

Gnu / Linuxボックスにbomstripがあるかどうかを確認します。Debian(および少なくとも他のいくつか)の一部ですが、インストールが必要な場合があります。Microsoftが誤ってutf-8ファイルの先頭にBOMを追加するため、これが必要です。
ctrl-alt-delor

回答:


17

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

「すべてのソフトウェア開発者がユニコードと文字セットについて絶対的かつ積極的に知っておくべき絶対的な最低限(言い訳なし!)」


Windowsはバイトを無駄にしますか?

1
Latin-1以外のものを使用していない場合は、はい。
イグナシオバスケス-エイブラムス

彼らは私がリンクした記事にあります。
イグナシオバスケス-エイブラムス

1
UTF-16LEを検索しましたが、記事で見つかりませんでした。

1
主に。BOMが存在する場合は、BOMもカウントする必要があります。
イグナシオバスケス-エイブラムス

11

改行

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

文字コード

最新の(つまり、2004年以降)Unixライクなシステムでは、UTF-8がデフォルトの文字エンコーディングになります。

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

問題のある特殊文字

U + 001A代替

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

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

ノーブレークスペース付きU + FEFFゼロ(バイトオーダーマーク)

Windowsでは、UTF-8ファイルはしばしばEF BB BFANSIファイルと区別するために「バイト順マーク」で始まります。

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


1
Ctrl-Zは、WindowsでCtrl-D(またはEOFにバインドした文字stty)がLinuxで実行するのと同じようにWindowsで機能します。コンソールドライバーはファイルの終わりに変換します。リテラル文字は入力ストリームに表示されません。read()が0を返すようにするだけです
。– psusi

バイトオーダーマークは、WindowsからLinuxに転送したphpファイルの#!(最初の行)を殺していると思います。ファイル全体は機能しますが、インタープリターを見つけることができません。Notepadでエンコード方法を選択してANSIでエンコードすることを具体的に確認した場合、それは真のASCIIですか、Windowsは何か他のことを行いますか?

1
「ANSIコードページ」という擬似用語は、メモ帳などのプログラムにはまだ表示されていますが、まったく間違った名前であることに言及する価値があり、Microsoftはずっと前に認めました。詳細については、en.wikipedia.org / wiki / Windows_code_pageを参照してください。
Incnis Mrsi

utf-8にはBOMはありませんが、MS-WindowsはBOMを挿入します。UTF-8ではない utf-8のルールの1つは、asciiで表現できるファイルは、utf-8でもビット単位で同一であることです。また、ストリームの任意の時点でutf-8の読み取りを開始できます。
ctrl-alt-delor

3

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

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

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

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

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

  • \ nはASCII 0x0A、改行(LF)です
  • \ rはASCII 0x0D、キャリッジリターン(CR)です

ASCII文字セットの\ r \ nと\ nはどこにありますか?en.wikipedia.org/wiki/File:ASCII_Code_Chart.svg

2
@Chris \ nはASCII 0x0A、改行です。\ rはASCII 0x0D、キャリッジリターン
リッチホモルカ

@Rich EOFはどうですか?これはANSIキャラクターですか?

2
@barlop、端末はキーストローク(Unixシステムでは通常ctrl-dです)をEOFに変換します(この制御キーが無効にされていない場合)。アプリケーションは、実際にヒットしたキーではなくEOFを読み取ります。つまりread()、特定の文字の代わりにゼロバイトを返します。
psusi

1
それは戻りません:@barlop、それは私が言っていることです任意の文字を。read()は、バッファに保存されたバイト数を返します。EOFでは、単にゼロバイトを提供します。これは、ファイルの終わりに到達したことを示すシグナルであり、これ以上読むものはありません。
psusi

1

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

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

ANSIはUnicodeではなく、文字数が非常に限られているため、脇に置いておきましょう。

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

また、メモ帳は別として、UTF-8はBOMを使用しても使用しなくてもかまいません。

そして、私はCygwinでWindowsを使用しますが、Windowsポートは\ n \ nを指定した場合でも\ r \ nを実行する可能性があります。

特定のOSが使用するUnicodeエンコーディングの規則はありません。もしあったとしても、非常に柔軟なOSではありません。

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

Cygwinとxxd、および/または16進エディターを入手して、ファイル内の実際の内容を確認します。'file'コマンドを使用して、ファイルを識別します。次に、UTF 16bit 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として保存できます

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

あなたが技術者であったり、メモ帳ユーザーであっても、OSのために1つのエンコーディングに縛られることはありません!

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

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

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

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


あなたはコマンドを書きましたfileし、typeCygwinのプロンプト内部の?
ヴェスノグ

xxdtype私が推測する標準のCygwinのインストールでコマンドが欠落しています。それとは別に、あなたの結果を再現したい。
ヴェスノグ

1
@Vesnog typeはcmd.exeに組み込まれた標準コマンドであり、 xxdデフォルトではcygwinとともにインストールされない可能性が高いですが、cygwinをインストールした後、cygwinセットアップを開始すると、cygwinで使用するためにインストールできるコマンドの長いリストが表示されます。そして、cygwin設定検索ボックスにxxdと入力するだけで表示されます。xxdはvim7のインストール後にも利用できるため、そこから入手することもできます。
barlop

1
@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

1
@Vesnog xxdはファイルを書き込むこともできます。echo 61|xxd -r -p>a.a次に試してみてください。type a.a 実際にxxd -pでバイトダンプを取得し、バイトを再配置または変更してからxxd -r -pにフィードし、異なるエンコーディングで新しい異なるファイルを取得するか、古いデータに基づいて異なるデータ。「ファイル」コマンドは、バイトに基づいてエンコードを決定しています。
-barlop

-1

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

これは、2011
。–ラムハウンド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.