ソースコードはUTF-8である必要がありますか?


10

多くの場合、コードの形式を実際に選択しないと思います。つまり、過去の私のツールのほとんどが私のために決定したということです。または私は本当にそれについてさえ考えていません。先日WindowsでTextPadを使用していて、ファイルを保存していると、ASCII、UTF-8 / 16、Unicodeなどについてプロンプトが表示されました...

書かれたコードのほとんどすべてがASCIIであると想定していますが、なぜそれがASCIIである必要があるのですか?ソースコードに実際にUTF-8ファイルを使用する必要がありますか。その理由は何ですか。これは多言語チームに役立つかもしれないと思います。多言語チームが変数/関数などに名前を付ける方法に関連する標準はありますか?


6
私はすべてのコードをクリンゴン語で記述しています。

5
@JackManey:これは/ではありません。あなたは鈍感な土塊!
FrustratedWithFormsDesigner

また、クリンゴン語のスクリプトはユニコードではないため、「私用」文字またはASCII文字変換を使用する必要があります。
dan04

@ dan04:クリンゴンはBMPの私的使用部分の疑似標準的な使用法を持っていますConScriptレジストリを参照してください):-)
Ross Patterson、

こちらの引数もご覧ください:utf8everywhere.org
Rory Hunter

回答:


23

選択は、ASCIIとUTF-8の間ではありません。ASCIIは7ビットのエンコーディングであり、UTF-8がそれを置き換えます-有効なASCIIテキストも有効なUTF-8です。非ASCII文字を使用すると問題が発生します。これらについては、UTF-8、UTF-16、UTF-32、およびさまざまな8ビットエンコーディング(ISO-xxxxなど)から選択する必要があります。

最善の解決策は、厳密なASCII文字セットを使用することです。つまり、コードで非ASCII文字を使用しないでください。ほとんどのプログラミング言語は、ASCII文字を使用して非ASCII文字を表現する方法を提供しています。たとえば"\u1234"、1234でUnicodeコードポイントを示します。特に、識別子に非ASCII文字を使用しないでください。それらが正しく機能する場合でも、別のキーボードレイアウトを使用しているユーザーは、これらの文字を入力させるためにあなたを呪います。

ASCII以外の文字を回避できない場合は、UTF-8が最適です。UTF-16やUTF-32とは異なり、これはASCIIのスーパーセットです。つまり、間違ったエンコードで開いた人は誰でも少なくとも大部分を正しく理解できます。8ビットコードページとは異なり、必要なほぼすべての文字を明確にエンコードでき、ロケールに関係なく、すべてのシステムで使用できます。

そして、あなたはあなたのコードが処理するエンコーディングを持っています。これは、ソースファイルのエンコーディングと同じである必要はありません。たとえば、PHPをUTF-8で簡単に作成できますが、内部のマルチバイトエンコーディングをたとえばLatin-1に設定します。PHPパーサーはエンコーディングにまったく関係なく、バイトシーケンスを読み取るだけなので、UTF-8文字列リテラルはLatin-1と誤って解釈されます。これらの文字列をUTF-8端末で出力した場合、違いはわかりませんが、文字列の長さやその他のマルチバイト操作(などsubstr)は誤った結果を生成します。

私の経験則では、すべてにUTF-8を使用します。他のエンコーディングを絶対に処理する必要がある場合にのみ、できるだけ早くUTF-8に変換し、できるだけ遅くUTF-8から変換してください。


6

ほとんどのIDEはデフォルトでUTF-8エンコーディングで保存するため、オプションが指定されている場合は、ASCIIではなくほぼ確実にUTF-8を選択する必要があります。これにより、国際化コードで奇妙な問題が発生することがなくなります。


2
ASCIIかUTF-8を選択するかのように見せかけています。ファイルに非ASCII文字がある場合は、そうではありません。ASCII文字のみの場合、UTF-8 ASCIIです。
Fred Foo

私はEclipseがこれを守ってくれることを望みます。初年度のCSっぽい学生として、私の神はこれがグループで作業するときに多くの頭痛の原因になっています。そこではOS X、WindowsおよびLinuxユーザーの存在があります。(参考までに、デフォルトではOS XではMacRoman、WindowsではCP-1252ですが、Linuxではどちらを使用するか忘れてしまいましたが、別のものだと思います。)
leflings

@leflings-おそらくデフォルトの環境エンコーディングで、現在は通常UTF-8です。
Maciej Piechotka 2014年

1

ソースコードで引用符付きの文字列または文字にプレーンテキストを入力でき、実際の文字を確認できるのは非常に便利です。たとえば、pi記号「π」または表意文字「𠀊」は、piの場合は同等の「\ u3c0」、表意文字の場合はL '\ u2000A'よりもはるかに優れています。

まともなエディターで、ASCII文字の場合と同じように、これらの文字を直接入力するか、コピーしてソースコードに貼り付けることができます。

具体的な例は、単語の説明が時々家に帰らないように見えるものを概念化して理解するのに役立ちます。次の簡単なコードスニペットの例のように、ソースコードに入力されたUnicode文字定数を概念化します。

const unsigned char  ASCII_0X7E      = (unsigned char)  '~';
const unsigned short UNICODE_0X3C0   = (unsigned short) 'π';
const unsigned long  UNICODE_0X2000A = (unsigned long)  '𠀊';
const unsigned long  UNICODE_0X2893D = (unsigned long)  '𨤽';

ASCIIチルダ文字「〜」はASCIIまたはUTF-8ソースファイルに保存できますが、Unicode文字はASCII形式で保存できません。PIシンボル「π」はUnicodeコードポイント0x3c0であり、UTF-8形式で2バイト値0xcf、0x80として格納できます。Unicodeコードポイント0x2000aおよび0x2893dの表意文字には、4バイトのUTF-8シーケンスが必要です。

これらの文字が意図した値を保持し、コンパイラーがそれらを意図したとおりに解釈するためには、ソースコードをUTF-8やUTF-16などのUnicode文字セットをサポートする形式で保存する必要があります。UTF-8として保存すると、適切なコンパイラーが意図したとおりに値を理解および解釈し、適切なエディターが文字を適切にロードして表示します。

他の人が指摘しているように、ASCII範囲外の文字がソースコードに含まれていない場合、UTF-8として保存すると、ASCIIファイルの保存と何の違いもありません。 8は、ASCII文字範囲でASCIIとオーバーラップするように設計されています。ASCIIコードの範囲外の文字をソースコードに入力するとすぐに、適切なエディタから、ファイルの保存に使用するエンコーディングを選択する必要があることが通知されます。UTF-8は、ASCIIをそのまま処理でき、開発環境でサポートされているほぼすべての他の文字を処理できるため、適切な選択です。

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