2016-03-21 5 views
0

私はregexを使用してユニコードの文字列と一致させ、文字列に格納しています。例:c#.NETはロシア文字をレンダリングしません

注:次のコンテンツは、外部テキストファイルから読み込む必要があります。そうしないと、ビジュアルスタジオは自動的にロシア語にレンダリングします。しかし、

"\"Name\":\\s*\"(?<match>[^\"]+)\"" 

私は、文字列に一致するものを保存するときのように、文字列が保存されます:

"Name": "\u0412\u0438\u043d\u043d\u0438\u0446\u0430, \u0443\u043b. \u041a\u0438\u0435\u0432\u0441\u043a\u0430\u044f, 14-\u0431", 

私は、パターンを使用しています.NETが保存されて

match = "\\u0412\\u0438\\u043d\\u043d\\u0438\\u0446\\u0430, \\u0443\\u043b. \\u041a\\u0438\\u0435\\u0432\\u0441\\u043a\\u0430\\u044f, 14-\\u0431" 

文字列に余分な "\"が付いています

私は使ってみました:

match = match.replace(@"\\", @"\") 

しかし、.NETは「ビジュアライザバージョン」を参照しているため、既存の@ "\\"を認識しません。

私はユニコードをC#で余分な '\'を付けずに保存できますか?

EDIT: もう一つのポイント:

// this works! 
string russianCharacters = "\u041b\u044c\u0432\u043e\u0432, \u0414\u043e\u043b\u0438\u043d\u0430, \u0432\u0443\u043b. \u0427\u043e\u0440\u043d\u043e\u0432\u043e\u043b\u0430, 18"); 

これはロシア語の文字としてビジュアライザで正しくレンダリングされます。しかし、外部のテキストファイルからの正規表現の文字を格納するときには、それはexcapedシーケンスとして格納されます。

エスケープされたユニコードのシーケンスではなく、文字列をロシア語の文字としてレンダリングするにはどうすればよいですか?

+2

うーん、ありません。 .NETはそのようなことはしません。おそらくあなたは混乱しています。なぜなら、これはデバッガが.NET文字列を表示する方法なのですから?代わりにプレーンテキストファイルに文字列を保存してみると、実際に*どのように見えるかがわかります( 'Encoding.Unicode'を使ってください)。'\\'は「ビジュアライザー」内にのみ存在します。そのため、それを置き換えることはできません。その逆もありません。 .NETは "ビジュアライザー"のバージョンを見ていない、あなたはそうです。 – Luaan

+2

いいえ、**あなた**はビジュアライザーのバージョンを見ています。ダブルバックスラッシュはありません。また、このような文字列を格納することで何を達成しようとしていますか? – CodeCaster

+2

HTMLDecodeは、HTMLEncodeを使用して以前にエンコードされた文字列で動作します。あなたの文字列はエンコードされていないので、.netがデコードする方法はありません。 https://msdn.microsoft.com/en-us/library/system.web.httputility.htmldecode(v=vs.110).aspx – Saleem

答えて

2

。つまり、あなたのC#の変数は次のようになります。実際のUnicode文字列を取得するには、

この場合、
var match = "\\u0412\\u0438\\u043d\\u043d\\u0438\\u0446\\u0430, \\u0443\\u043b. \\u041a\\u0438\\u0435\\u0432\\u0441\\u043a\\u0430\\u044f, 14-\\u0431" 

または

var match = @"\u0412\u0438\u043d\u043d\u0438\u0446\u0430, \u0443\u043b. \u041a\u0438\u0435\u0432\u0441\u043a\u0430\u044f, 14-\u0431" 

、あなたがRegex.Unescapeを使用する必要があります。

は、任意のエスケープ変換します入力文字列内の文字。

C# demo

var s = "\\u0412\\u0438\\u043d\\u043d\\u0438\\u0446\\u0430, \\u0443\\u043b. \\u041a\\u0438\\u0435\\u0432\\u0441\\u043a\\u0430\\u044f, 14-\\u0431"; 
Console.WriteLine(s); 
// \u0412\u0438\u043d\u043d\u0438\u0446\u0430, \u0443\u043b. \u041a\u0438\u0435\u0432\u0441\u043a\u0430\u044f, 14-\u0431 
Console.WriteLine(Regex.Unescape(s)); 
// Винница, ул. Киевская, 14-б 
+1

Briliantソリューション! –

3

余分な '\'は単なるエスケープ文字です。私は、デバッガウィンドウの値を見ていると思いますが、その場合は余分な '\'が表示されますが、基本値には余分な '\'がありません。実際の値を使ってみると、これが表示されます。

このコードは期待通りに動作します:あなたが実際にリテラルのUnicodeポイントではなく、実際のUnicodeの記号を含むテキストファイルから文字列を読んでいるようだ

var myString = "\"Name\": \"\u0412\u0438\u043d\u043d\u0438\u0446\u0430, \u0443\u043b.\u041a\u0438\u0435\u0432\u0441\u043a\u0430\u044f, 14 - \u0431\","; 
var pattern = "\"Name\":\\s*\"(?<match>[^\"]+)\""; 
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase); 
MatchCollection matches = rgx.Matches(myString); 

if (matches.Count > 0) 
{ 
    foreach (Match match in matches) 
    { 
     var ma = System.Web.HttpUtility.HtmlDecode(match.ToString()); 
    } 
} 
+0

ユニコードをロシア語の文字として正しくレンダリングするにはどうすればよいですか?ビジュアライザーは、\ u0412 \ u0438 \ u043d \ u043d \ u0438 \ u0446 \ u0430、\ u0443 \ u043bを表示しています。 \ u0438 \ u0435 \ u0432 \ u0441 \ u043a \ u0430 \ u044f、14- \ u0431正しいですが、文字列を実際にレンダリングする必要があります。ロシア語の文字 – Mike

+0

テストコードを追加しました。 –

+0

まだ私のために働いていない。あなたの例では、myStringは自動的にロシア文字にレンダリングされます。しかし、あなたはあなたの正規表現を外部のテキストファイルにマッチさせます。実際のロシア語の文字ではなく、エスケープされたUnicodeのシーケンスとして保存されます – Mike