3
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-10-03

普段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になっている。
参考サイト: Windowsコマンドプロンプト 文字コード設定

3
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2