2016-08-11 16 views
1

次のような特殊文字を含む文字列があります。文字列からUTF16文字を削除するには?

こんにちは。

私が知る限り、 ""はUTF16文字です。

この文字とUTF8以外の文字列を文字列から削除するにはどうすればよいですか?

問題は、.NETとJavaScriptが有効な2つのUTF8文字としてそれを参照してくださいということです。

int cs_len = "".Length; // == 2 - C# 
var js_len = "".length // == 2 - javascript 

strIn [0] 55356 UTF8文字です==☐

strIn [1]は57152 UTF8文字==☐

また、n

 string res = null; 

     using (var stream = new MemoryStream()) 
     { 
      var sw = new StreamWriter(stream, Encoding.UTF8); 

      sw.Write(strIn);     
      sw.Flush(); 
      stream.Position = 0; 

      using (var sr = new StreamReader(stream, Encoding.UTF8)) 
      { 
       res = sr.ReadToEnd(); 
      } 
     } 

     return res;//Hello 

string strIn = "Hello "; 
string res; 
byte[] bytes = Encoding.UTF8.GetBytes(strIn); 
res = Encoding.UTF8.GetString(bytes); 
return res;//Hello 

は私も英語だけでなく中国語と日本語と他の言語、また他のUTF8文字だけでなく、サポートする必要があります:EXTのコードスニペットは、同じ結果を返します。符号を含むC#またはJavaScriptコードのUTF16文字を削除または置換するにはどうすればよいですか?

ありがとうございました。

+2

Umm「UTF-8は、Unicodeで定義されている可能性のあるすべての文字またはコードポイントをエンコードできる文字エンコードです」 - 文字はどのように「UTF16文字」でも「UTF8文字」でもありませんか?あなたの例はUTF-16で '3C D8 40 DF'、UTF-8で' F0 9F 8D 80 'です。 –

+1

唯一の違いは、シリアル化したときのバイト数ですが、1文字は文字列の1文字だけです(javascriptとC#)。 – fbiagi

+0

@ piet.t UTF16にはUTF8以上の文字が含まれているので、これまでのところ2つのUTF8文字を使用することができます。 – gscriptor

答えて

1

UTF-16とUTF-8は同じ数の「文字」を含んでいます(正確には、文字を表す可能性のあるコードポイントはDavid Haimのおかげです)。バイト。

あなたの例では、 ""はUTF-16で3C D8 40 DF、UTF-8でF0 9F 8D 80です。

あなたの問題記述と貼り付けられた文字列から、あなたのソースコードがUTF-8でエンコードされていると思われますが、コンパイラ/インタプリタはUTF-16として読み込んでいます。したがって、1文字のUTFシーケンスF0 9F 8D 80は、2つの別々のUTF-16文字のF0 9f8D 80として解釈されます。最初の文字は無効なUnicode文字で、2番目の文字は "Han Character"です。あなたの例では

あなたはプラスあなたはあなたにそのエンコーディングを指定することができるかどうかを確認する必要がありますが、それはファイルを保存するために使用するものエンコーディングあなたのソースを作成するために使用するエディタをご覧ください:問題を解決する方法については

コンパイラオプション。

ハードコーディングされた文字列リテラルを使用せずにファイルまたはネットワーク経由で入力内容を読み込むと、かなり違って見えることにも注意してください。入力を読むときに既にエンコードの問題を処理する必要があります。

+0

彼らは同じ数の*コードポイント*を同じ数の文字に入れません –

+0

@DavidHaim訂正してくれてありがとう - 私はそれを明確にしようとしました。 –

0

私は私の質問への解決策を見つけ、それはすべてUTF-16文字をカバーしていますが、それらの多くを削除しません:

ここ
var title = 
title.replace(/([\uE000-\uF8FF]|\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF])/g, '*'); 

、私は「スター」*ですべての特殊文字を置き換えます。空の文字列''を入力して削除することもできます。

文字列の末尾にある/gの意味は、これらの特殊文字がないと、string.replace(...)が最初の文字だけを削除する可能性があるためです。

関連する問題