4

同様の質問に答える多くの投稿を見つけました(「置換\方法/」または「置換方法」など)。それらすべてを理解\\\ていますが、どれも私の特別な問題を解決していません。ここにあります:

レジストリからパス文字列を読み取っています。これには、" ///" の代わりに " \" (簡単に置換できます) が含まれていますが/u00xy、Unicode 文字の " " も含まれています。文字列を正しいユニコード文字で正常に解析するには/、 を単一 \の に置き換える必要があります。しかし、すべての可能な方法 (string.replaceまたはregex.replace) は、" \\u00xy" ではなく " \u00xy" になります!

または、「 」のようなエラーが表示されますUnrecognized escape sequence。例えば:

str.Replace("/u00", @"\u00")   // results in "\\u00"

一方:

str.Replace("/u00", "\u00")    // gives an error.

私はアイデアがありません!

4

2 に答える 2

3

私はこのようなものがあなたのために働くべきだと信じています:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Globalization;

namespace Test
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(ConvertUnicodeEscapes("aa/u00C4bb/u00C4cc/u00C4dd/u00C4ee")); //  prints aaÄbbÄccÄddÄee
        }

        private static Regex r = new Regex("/u([0-9A-F]{4})");
        private static string ConvertUnicodeEscapes(string input)
        {
            return r.Replace(input, m => {
                int code = int.Parse(m.Groups[1].Value, NumberStyles.HexNumber);
                return char.ConvertFromUtf32(code).ToString();                    
            } );
        }       

    }
}

Jon が指摘したように、これは単に「/」を単一の「\」に置き換えるだけではありません。「\」はエスケープ文字であるため、実際にはできません。まず、グループ "/uXXXX" を一致させる必要があります。次に、文字列の 16 進部分 (XXXX) を utf32 (つまり unicode) の整数に変換します。最後に、その utf32 コードに対応する文字を取得します。

于 2012-11-05T17:42:17.403 に答える
2

編集:あなたがやろうとしていることを理解しました。それが機能することはまったく驚くべきことではありません。文字列の「内部」表現について話しているのではありません.C#固有の文字列リテラル解析ルールを実行時に適用することを本当に求めています。

あなたが書く場合:

string x = "\u0041";

... 単一文字 ('A') を含む文字列を作成します。元のソース コードでは Unicode エスケープ シーケンスとして表されていたという事実は、文字列にはまったく影響しません。したがって、上記のコードは実行時に次のものと区別できません。

string x = "A";

ここで、スラッシュ、その後にu、その後に 4 つの 16 進数が続く文字列を 1 つの文字に解析したいようです。自分でそれを行うか、それを行う別のライブラリを見つける必要があります-あなたstring.Replaceのためにそれを行うことを期待すべきではありません.

つまり、データ自体とデータのソース コード表現の違いを理解することが重要です。


あなたは主張します:

str.Replace("/u00", @"\u00")    

結果は「\u00」

いいえ、そうではありません。結果をコンソールに書き出すと、バックスラッシュが 1 つしかないことがわかります。

エスケープされたビューを表示しているデバッガーを見ているのではないかと強く思います。

デモコード:

using System;

class Test
{
    static void Main()
    {
        string input = "x/u00y";
        string output = input.Replace("/u00", @"\u00");
        Console.WriteLine(output); // Result: x\u00y
    }
}

このコード:

str.Replace("/u00", "\u00") 

"\u00"文字列リテラルが無効であるため、実際に失敗します。これは、未終了の Unicode 文字エスケープ シーケンスです。

于 2012-11-05T17:08:03.550 に答える