普段Shift_JISでC#ソースを書いていたが、ちょっと気になったので調べてみた。
Shift_JISのテキストファイルを読み込むときは気を付けようくらいのつもりで
「初心者」タグをつけてみたものの、色々調べてみたら自分も「初心者」であることが露見した件。
下記はWindows10環境です。
使ったコンパイラ:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
ソースコードの文字コード
下記のコードを
- Shift_JISで保存してコンパイル
- UTF-8で保存してコンパイル
して実行してみる。
using System;
class SampleTest
{
[STAThread]
static void Main() {
Console.WriteLine("Hello World ようこそ");
}
}
実行結果はいずれも下記が表示された。
Hello World ようこそ
C#ソースコードの文字コードはShift_JISでもUTF-8でもよさげ?
⇒コンパイルオプション(/codepage
)で明示しない場合はUTF-8が推奨のよう
直接cscを使う場合は/codepage
が指定できるが、Visual Studioではこのオプションはサポートしてないらしい。(使う必要がないからと思われる。)
ソースコードのエンコードの指定
/codepage:XXX
オプションでソースコードの文字コードを指定できる。
ここのXXX
はコードページ番号を指定しないといけない。(/codepage:UTF-8
とかだとcscがエラーを吐く。)
UTF-8の場合は、csc /codepage:65001 YYY.cs
みたいに指定する。
コードページ一覧はここ参考
文字列(string)のC#プログラム内部表現
上記で作成した各exeをildasmで開いてみた。
C#の内部表現はUTF-16(のリトルエンディアンのほう)だそう。
さっきまでUTF-8かと思っていた
.method private hidebysig static void Main() cil managed
{
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr bytearray (48 00 65 00 6C 00 6C 00 6F 00 20 00 57 00 6F 00 // H.e.l.l.o. .W.o.
72 00 6C 00 64 00 20 00 88 30 46 30 53 30 5D 30 ) // r.l.d. ..0F0S0]0
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method SampleTest::Main
とはいえ、処理速度やリソースがシビアでなければ内部表現を気にする必要はあまりないと思ってます。
C#プログラムが読み込むテキストファイルの文字コード
基本的には(エンコードを指定しない場合は)UTF-8
のよう。(File.ReadAllLines(string)メソッド
など)
標準外のライブラリとかはしらんですが。
Encoding
クラスで明示的に指定するのが無難かと。
Shift_JISのテキストファイルを扱うプログラムを書くときは気を付けよう。
識別子に日本語が使えてしまう
下記のソースコードはコンパイルが通り、正しく動作する。ちなみに全角空白は空白として処理されるよう。
個人的には、英語が苦手でも識別子を日本語にするのはお勧めしない。日本語は表現がゆらぐので。。
using System;
class SampleTest
{
[STAThread]
static void Main() {
int あ = 5;
Console.WriteLine(あ+6);
}
}
正規表現
初心者向けから逸れてきた感があるが・・・
\s
は全角スペースも含む。
[あ-お]
みたいなこともできるっぽい。[あぁいぃうぅえぇお]
と多分おなじ。※ちゃんと確認してない。
コマンドプロンプトにおける文字コード
自分の環境はデフォルトはShift_JISになっている。
参考サイト: Windowsコマンドプロンプト 文字コード設定