33

テキスト ファイルを文字列に読み込んで、すべての Unicode エスケープを文字列内の実際の Unicode 文字に変換したいとします。

例:

「次は Unicode の整​​数文字 '\u2320' の上半分で、これは下半分の '\U2321' です。」

4

5 に答える 5

49

答えは簡単で、少なくとも数千文字までの文字列でうまく機能します。

例 1:

Regex  rx = new Regex( @"\\[uU]([0-9A-F]{4})" );
result = rx.Replace( result, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString() );

例 2:

Regex  rx = new Regex( @"\\[uU]([0-9A-F]{4})" );
result = rx.Replace( result, delegate (Match match) { return ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); } );

最初の例は、ラムダ式 (C# 3.0) を使用して行われる置換を示し、2 番目の例は、C# 2.0 で動作するはずのデリゲートを使用しています。

ここで何が起こっているかを分析するために、まず正規表現を作成します。

new Regex( @"\\[uU]([0-9A-F]{4})" );

次に、文字列 'result' と、文字列で見つかった各正規表現を変換する匿名メソッド (最初の例ではラムダ式、2 番目の例ではデリゲート - デリゲートは通常のメソッドでもかまいません) を指定して Replace() を呼び出します。 .

Unicode エスケープは次のように処理されます。

((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); });

エスケープの数字部分を表す文字列を取得します (最初の 2 文字をスキップします)。

match.Value.Substring(2)

Int32.Parse() を使用してその文字列を解析します。これは、Parse() 関数が期待する文字列と数値形式 (この場合は 16 進数) を取ります。

NumberStyles.HexNumber

次に、結果の数値を Unicode 文字にキャストします。

(char)

最後に、Unicode 文字で ToString() を呼び出します。これにより、Replace() に返される値である文字列表現が得られます。

.ToString()

注: Substring 呼び出しで変換するテキストを取得する代わりに、match パラメーターの GroupCollection を使用し、正規表現の部分式を使用して数値 ('2320') だけを取得することもできますが、これはより複雑で読みにくくなります。

于 2008-10-08T17:32:18.420 に答える
7

これは VB.NET に相当します。

Dim rx As New RegularExpressions.Regex("\\[uU]([0-9A-Fa-f]{4})")
result = rx.Replace(result, Function(match) CChar(ChrW(Int32.Parse(match.Value.Substring(2), Globalization.NumberStyles.HexNumber))).ToString())
于 2012-10-30T15:36:12.573 に答える
1

正規表現に小文字を追加したほうがよいと思います。それは私にとってはうまくいきました。

Regex rx = new Regex(@"\\[uU]([0-9A-Fa-f]{4})");
result = rx.Replace(result, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString());
于 2012-07-04T14:25:11.640 に答える
1

プロジェクトにクラスを追加UnicodeExtensions.csします。

public static class UnicodeExtensions
{
    private static readonly Regex Regex = new Regex(@"\\[uU]([0-9A-Fa-f]{4})");

    public static string UnescapeUnicode(this string str)
    {
        return Regex.Replace(str,
            match => ((char) int.Parse(match.Value.Substring(2),
                NumberStyles.HexNumber)).ToString());
    }
}

利用方法:

var test = "\\u0074\\u0068\\u0069\\u0073 \\u0069\\u0073 \\u0074\\u0065\\u0073\\u0074\\u002e";
var output = test.UnescapeUnicode();   // output is => this is test.
于 2021-12-02T10:22:04.287 に答える