Edited at

C#における文字コードの扱い(Windows10環境)

普段Shift_JISでC#ソースを書いていたが、ちょっと気になったので調べてみた。

Shift_JISのテキストファイルを読み込むときは気を付けようくらいのつもりで

「初心者」タグをつけて調べてみたら、自分も「初心者」であることが露見した件。

下記はWindows10環境です。

使ったコンパイラ:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe


ソースコードの文字コード

下記のコードを

1. Shift_JISで保存してコンパイル

2. 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になっている。

参考サイト: https://qiita.com/user0/items/a9116acc7bd7b70ecfb0