- 題名: ユニコードエスケープ文字のエンコードについて
- 日時: 2010/08/15 9:05:53
- ID: 27179
- この記事の返信元:
- (なし)
- この記事への返信:
- [27180] Re[1]: ユニコードエスケープ文字のエンコードについて2010/08/15 10:19:04
- ツリーを表示
MatchEvaluator を使ってこんな感じです。
string text = File.ReadAllText(file);
// \u は Regex でも Unicode エスケープシーケンスとして扱われるので
// 文字列「\u」にマッチさせるには \\u と表現する必要がある。
// さらに C# レベルで \ をエスケープするために \ 一つを \\ と記述する。
// C# レベルのエスケープが面倒なら逐語的リテラル文字列を使うのも手。
text = Regex.Replace(text, "\\\\u(?<code>[0-9a-fA-F]{4})", Replace);
static string Replace(Match m) {
int code = Convert.ToInt32(m.Groups["code"].Value, 16);
// char 型は UTF-16 で同等の数値型と可換。
return ((char)code).ToString();
}
なお、C# の Unicode 文字エスケープシーケンスは厳密には UTF-16 で表現する物なので、
基本多言語面(BMP)以外の文字はサロゲートペアとして二つの \uXXXX で表記されます。
上記変換関数もそのように扱っています。
2010/08/15(Sun) 16:56:26 編集(投稿者)
Hongliangさん
迅速な回答ありがとうございます。
この方法で、対応することが出来ました。
エレガントなお答え、ありがとうございます!
自分は、正規表現が不得意なので、アドホック的に以下のように対処しようとしていました・・・
private string convertHexUnicode(string intext)
{
char [] array = intext.ToCharArray();
string outstr = "";
for( int i = 0; i<array.Length; i++ )
{
if( array[i] != '\\' )
{
outstr += array[i].ToString();
}
else
{
// array[i] == '\\'
if( i < array.Length-1 && array[i+1] == 'u' )
{
try
{
string tmpstr = "";
tmpstr += array[i+2];
tmpstr += array[i+3];
tmpstr += array[i+4];
tmpstr += array[i+5];
int tmpi = int.Parse(tmpstr, System.Globalization.NumberStyles.HexNumber);
outstr += (char) tmpi;
i+=5;
}
catch
{
}
}
}
}
return outstr;
}
分類:[.NET]
いつも参考にさせていただいています。
実は、ファイルに格納している以下の文字列
「今日は、\u702c\u6238へ行く。」
を読み込もうとしています。
この際、unicodeをエスケープ表記している部分が
漢字の「瀬戸」にならなくて困っております。
ネットでも調べましたが、上手くヒットしません。
どなたかお知恵を拝借願えればと存じポストいたしました。