Unicode文字列をUnicodeスカラ値に変換する - C#

Unicode文字列をUnicodeスカラ値に変換するコードを紹介します。

Unicodeスカラ値とは

Unicodeの文字をASCII文字で表現するため、"U+" の後に16進数でその値を記述する書式です。"#U"に続けて16進数で値を記述するものもあります。

サンプルプログラム

ASP.NET Webアプリケーションを作成します。

UI

下図のUIを作成します。TextBoxを2つ、Buttonを1つ配置します。


aspxファイルのコードは以下になります。
UnicodeToUnicodeScalar.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UnicodeToUnicodeScalar.aspx.cs" Inherits="UnicodeConverter.UnicodeToUnicodeScalar" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <div><asp:TextBox ID="TextBox1" runat="server" Width="480px"></asp:TextBox></div>
    <div><asp:Button ID="Button1" runat="server" Text="変換" /></div>
    <div><asp:TextBox ID="TextBox2" runat="server" Width="480px"></asp:TextBox></div>
  </div>
  </form>
</body>
</html>

コード

aspx.csファイルのコードは以下になります。
UnicodeToUnicodeScalar.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;

namespace UnicodeConverter
{
  public partial class UnicodeToUnicodeScalar : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
      UnicodeEncoding unicode = new UnicodeEncoding(true, false);
      string input = TextBox1.Text;

      string output = "";
      for (int i = 0; i < input.Length; i++) {
        char[] c = new char[1] {input[i]};
        byte[] encodedBytes = unicode.GetBytes(c);
        output += "U+";
        for (int j = 0; j < encodedBytes.Length; j++) {
          output += string.Format("{0:x2}", encodedBytes[j]);
        }
      }
      TextBox2.Text = output;
    }
  }
}

解説

  UnicodeEncoding unicode = new UnicodeEncoding(true, false);
上記コードでUnicodeに変換するためのUnicodeEncodingクラスのインスタンスを作成します。コンストラクタの第一引数はビッグエンディアンかを指定するフラグです。trueを与えるとビッグエンディアンとして処理します。falseを与えた場合はリトルエンディアンとして処理します。第二引数はバイト順マークを付加するかの設定です。今回はfalseに設定します。

  string input = TextBox1.Text;

  string output = "";
  for (int i = 0; i < input.Length; i++) {
    char[] c = new char[1] {input[i]};
    byte[] encodedBytes = unicode.GetBytes(c);
    output += "U+";
    for (int j = 0; j < encodedBytes.Length; j++) {
      output += string.Format("{0:x2}", encodedBytes[j]);
    }
  }
テキストボックスに入力した文字列を取得し、一文字ずつ処理します。(インデックスがiのforループが入力文字を一文字ずつ処理するループです。)
文字を取り出し、char[]配列に代入し、UnicodeEncodingクラスのGetBytes()メソッドを呼び出して文字のバイト値を取得します。取得できたバイト値をテキストボックスに出力します。テキストボックスに出力する際に頭に"U+"の文字列を付加します。

実行結果

プロジェクトを実行します。Webブラウザが起動し、下図の画面が表示されます。


上部のTextBoxに文字列を入力します。入力後[変換]ボタンをクリックします。


Unicodeスカラー値に変換された文字列が下部のテキストボックスに表示されます。


以上でUnicode文字列をUnicodeスカラー値に変換できました。

参考情報

ビッグエンディアンとリトルエンディアンでの動作の違いを紹介します。
エンディアンの切り替えは、UnicodeEncodeingクラスのコンストラクタの第一引数を変更します。(第一引数がtrueの場合はビッグエンディアン、falseの場合はリトルエンディアンになります。)
UnicodeEncoding unicode = new UnicodeEncoding(true, false);

ビッグエンディアンの場合


リトルエンディアンの場合



出力の上位バイトと下位バイトが入れ替わっていることがわかります。ビッグエンディアンでは"5b"-"b6"の順ですが、リトルエンディアンでは"b6"-"5b"の順番になります。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2014-02-24
iPentec all rights reserverd.