20

私のC#コードでは、PDFドキュメントからテキストを抽出しています。これを行うと、UTF-8またはUnicodeエンコーディングの文字列が表示されます(どちらかはわかりません)。Encoding.UTF8.GetBytes(src);これをバイト配列に変換するために使用すると、空白は実際にはバイト値が194と160の2文字であることがわかります。

たとえば、文字列「CLEaction」は次のようになります。

[67, 76, 69, 194 ,160, 65 ,99, 116, 105, 111, 110]

バイト配列では、空白は194と160です...そして、これsrc.IndexOf("CLE action");が原因で、1を返す必要があるときに-1が返されます。

文字列のエンコーディングを修正するにはどうすればよいですか?

4

3 に答える 3

32

194 160NO-BREAK SPACEコードポイント(HTMLが呼び出すのと同じコードポイント)のUTF-8エンコーディングです 

ですから、まるでスペースのように見えても、実際にはスペースではありません。(たとえば、ワードラップされないことがわかります。)の正規表現の一致は\sそれに一致しますが、スペースとの単純な比較は一致しません。

ノーブレークスペースを単純に置き換えるには、次のようにします。

src = src.Replace('\u00A0', ' ');
于 2012-12-21T15:40:43.263 に答える
3

UTF8では、文字値c2 a0(194 160)はノーブレークスペースとして定義されます。ISO / IEC 8859によると、これは改行を挿入できないスペースです。通常、テキスト処理ソフトウェアは、任意の空白文字に改行を挿入できることを前提としています(これが通常のワードラップの実装方法です)。問題を解決するには、文字列の文字列を通常のスペースに置き換えるだけでよいはずです。

于 2012-12-21T15:45:56.373 に答える
2

\xC2\xA0(= 194, 160)をUTF8として解釈すると、実際\xA0には、Unicodeのノーブレークスペースが生成されます。これは通常のスペースとは異なる文字であるため、通常のスペースとは一致しません。改行しないスペースと照合するか、空白に対してあいまい照合を使用する必要があります。

于 2012-12-21T15:40:30.877 に答える