Help us understand the problem. What is going on with this article?

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

kob58im
趣味でC#で色々試してます。 置いてるほとんどのC#サンプルコードは、Windows7以降デフォで入ってる環境でコンパイルできます。 最近はCodePen使ってJavaScriptも書いてます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away