技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

半角カナの文字コードに関する注意

0x00~0x7FのASCIIコード(半角英数記号やNUL・改行等の特殊な文字)に関しては文字コードセットの違いを気にする必要がないのですが、日本語の文字に関しては複数の文字コードセットが存在し、違いを気にする必要があります。
半角カナについても例外ではなく、同じ半角文字といっても半角英数記号とは扱いが異なります。1バイトであるとも限りません。
 
例えば、SJISでは0xA1~0xDFが半角カナの領域なのですが、Unicode系では下記公式ドキュメントの通り0xFF61~0xFF9Fが半角カナの領域となっています。

https://www.unicode.org/charts/PDF/UFF00.pdf

 
Webで調べてみても、半角カナの扱いの違いによる互換性の問題が散見されます。文字コードを判定したり変換したりする際には注意が必要です。
 
なお、C#のプログラムで引数で半角カナを与えた場合、下記の通りUnicode系の文字コードが割り振られるようです。
(引数を与えているバッチファイルはSJISで記述しています)
 
【サンプルコード】
・Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = args[0];
            ushort code;
            for(int i = 0; i < str.Length; i++)
            {
                code = str[i];
                Console.WriteLine
                    (str[i] + " : " + Convert.ToString(code, 16));
            }
        }
    }
}
 
・Program.bat
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe Program.cs
Program.exe 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚
pause
 
【実行結果】
C:\tmp>C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe Program.cs
Microsoft (R) Visual C# Compiler version 4.7.3062.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.

This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, w
hich is no longer the latest version. For compilers that support newer versions of the C# programming language, see http
://go.microsoft.com/fwlink/?LinkID=533240


C:\tmp>Program.exe 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚
。 : ff61
「 : ff62
」 : ff63
、 : ff64
・ : ff65
ヲ : ff66
ァ : ff67
ィ : ff68
ゥ : ff69
ェ : ff6a
ォ : ff6b
ャ : ff6c
ュ : ff6d
ョ : ff6e
ッ : ff6f
ー : ff70
ア : ff71
イ : ff72
ウ : ff73
エ : ff74
オ : ff75
カ : ff76
キ : ff77
ク : ff78
ケ : ff79
コ : ff7a
サ : ff7b
シ : ff7c
ス : ff7d
セ : ff7e
ソ : ff7f
タ : ff80
チ : ff81
ツ : ff82
テ : ff83
ト : ff84
ナ : ff85
ニ : ff86
ヌ : ff87
ネ : ff88
ノ : ff89
ハ : ff8a
ヒ : ff8b
フ : ff8c
ヘ : ff8d
ホ : ff8e
マ : ff8f
ミ : ff90
ム : ff91
メ : ff92
モ : ff93
ヤ : ff94
ユ : ff95
ヨ : ff96
ラ : ff97
リ : ff98
ル : ff99
レ : ff9a
ロ : ff9b
ワ : ff9c
ン : ff9d
゙ : ff9e
゚ : ff9f

C:\tmp>pause
続行するには何かキーを押してください . . .