元のANSI標準で定義されている128文字セットのみを使用しています。
しかし、全体として、ファイルはどのように異なる方法で実装されますか。
表示には関係ありません。つまり、タブが6文字または8文字で表示されているが、メモリ内の実際の内部表現が表示されている場合
私が聞いた違いの1つは、\ r \ n(Windows)と回線終端(\ n)の\ nの使用です。
元のANSI標準で定義されている128文字セットのみを使用しています。
しかし、全体として、ファイルはどのように異なる方法で実装されますか。
表示には関係ありません。つまり、タブが6文字または8文字で表示されているが、メモリ内の実際の内部表現が表示されている場合
私が聞いた違いの1つは、\ r \ n(Windows)と回線終端(\ n)の\ nの使用です。
回答:
Windowsの「Unicode」はUTF-16LEで、各文字は2または4バイトです。LinuxはUTF-8を使用し、各文字は1〜4バイトです。
「すべてのソフトウェア開発者がユニコードと文字セットについて絶対的かつ積極的に知っておくべき絶対的な最低限(言い訳なし!)」
WindowsはCRLF(\r\n
、0D 0A
)行末を使用しますが、UnixはLF(\n
、0A
)を使用します。
最新の(つまり、2004年以降)Unixライクなシステムでは、UTF-8がデフォルトの文字エンコーディングになります。
ただし、WindowsにはUTF-8のネイティブサポートがありません。内部的にUTF-16で動作し、char
ベースの文字列がレガシーコードページにあると想定しています。幸いなことに、メモ帳はUTF-8ファイルを読み取ることができます。残念ながら、「ANSI」エンコーディングは依然としてデフォルトです。
Windowsは(まれに)ファイルの終わりの文字としてCtrl+ Zを使用します。たとえばtype
、コマンドプロンプトでファイルを作成した場合、最初の1A
バイトで切り捨てられます。
Unixでは、Ctrl+ Zは特別なものではありません。
Windowsでは、UTF-8ファイルはしばしばEF BB BF
ANSIファイルと区別するために「バイト順マーク」で始まります。
Linuxでは、BOMはシェルスクリプトのシェバン行などを壊すため推奨されません。さらに、とにかくUTF-8がデフォルトのエンコーディングである場合、UTF-8署名を使用しても意味がありません。
stty
)がLinuxで実行するのと同じようにWindowsで機能します。コンソールドライバーはファイルの終わりに変換します。リテラル文字は入力ストリームに表示されません。read()が0を返すようにするだけです
私が聞いた違いの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:
read()
、特定の文字の代わりにゼロバイトを返します。
使用される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
し、type
Cygwinのプロンプト内部の?
xxd
とtype
私が推測する標準のCygwinのインストールでコマンドが欠落しています。それとは別に、あなたの結果を再現したい。
type
はcmd.exeに組み込まれた標準コマンドであり、 xxd
デフォルトではcygwinとともにインストールされない可能性が高いですが、cygwinをインストールした後、cygwinセットアップを開始すると、cygwinで使用するためにインストールできるコマンドの長いリストが表示されます。そして、cygwin設定検索ボックスにxxdと入力するだけで表示されます。xxdはvim7のインストール後にも利用できるため、そこから入手することもできます。
c:\cygwin\bin
(cygwinのbinサブディレクトリがある場合)、パスに追加 します。また、「type」や「dir」などの内部cmdコマンド、またはcalc.exe(windows calculator)などの外部exeは、cygwin内から実行/起動できます。cygwinから実行できるものはほとんどcmdから実行でき、その逆も可能です。bashを使用したい場合はcygwinを使用し、一重引用符と二重引用符で問題が発生した場合は、cygwin内でcygwinコマンドを実行し、cmd内でcmdコマンドを実行します。
echo 61|xxd -r -p>a.a
次に試してみてください。type a.a
実際にxxd -pでバイトダンプを取得し、バイトを再配置または変更してからxxd -r -pにフィードし、異なるエンコーディングで新しい異なるファイルを取得するか、古いデータに基づいて異なるデータ。「ファイル」コマンドは、バイトに基づいてエンコードを決定しています。
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