2008-09-16 7 views

答えて

18

「ジャンク」は、誰かがUTF-8データをISO 8859-1またはWindows-1252として解釈したように見えます。

ââ,¬â "¢は配列C3 A2、E2 82 AC、E2 84 A2である。

  • UTF-8 C3 A2 = U + 00E2 =â
  • UTF-8 E2 82 AC = U + 20AC =€
  • UTF-8 E2 84 A2 = U + 2122 =™

我々は再びそれを行う:Windowsの1252年に、このシーケンスは、E2 80 99であるので、文字はU + 2019、RIGHT SINGLE QUOTATION MARK( ')

あなたはバイト配列を持つ複数のパスを作ることができるが、エンコードされている必要があります.UTF8とEncoding.GetEncoding(1252)が正しくジャンク・バを回転させる最初に入力されたものに変換する。 UTF-8データがWindows-1252として誤って解釈された場所を探すために、処理を確認する必要があります。

0

これらの文字のASCII /整数コードは、通常のアルファベットの範囲外です。シークして空の文字で置き換えます。 Stringは私が信じているReplaceメソッドを持っています。

+0

これは簡単ですが、私が考えるベストソリューションではありません。 私はできるだけ最適な(最速の)方法が必要です。 :)しかし、アイデアのおかげで。 –

1

Regex.Replace(your_string、regex、 "") - これは私が使用しているものです。

+0

良いアイデア:)私はすべて正規表現について忘れました:) –

3
"I Don’t see ya..".Replace("’", string.Empty); 

このジャンクはどのように最初に入りましたか?それが本当の質問です。

+0

"非常に面白い" :) –

+0

@HalFas、それはエンコードの問題のようです。 –

+0

残念ながら、閉鎖されたソースシステムのバグが原因である可能性があります(たとえば、SparxsystemsのArchitectのXMLエクスポートの属性の1つだけが会社の上海支店で誤ってエンコードされているため、フランスまたはイングランドで) –

1

各文字を順番にテストして有効な英字または数字であるかどうかを確認し、そうでない場合は文字列から文字を削除します。文字のテストがあり、そのような

char.IsSymbol; 
char.IsControl; 
0

...など様々な他の人はどちらかであるあなたがしたい、または好ましくありませんもののブラックリストを使用してください...ちょうど使用し、

char.IsLetterOrDigit; 

非常に簡単ですホワイトリスト(セット)。ホワイトリストでは、文字列を繰り返し処理し、ホワイトリストにある文字だけを結果文字列にコピーします。あなたは取り外し言って、あなたがそれを行う方法は、二つのポインタを使用すると、(R)から読み出された1とあなたは(W)に書き込む1つを有するされています

I Donâ₠
    W R 

カンマがあなたのホワイトリストにある場合、あなたはこのケースで読んでいましたカンマを書いて、Ãがどこにあるかを書いて、両方のポインタを進めます。 UTF-8はマルチバイトエンコーディングなので、ポインタを前進させるだけでアドレスに追加するだけでなく、

isalnum、isalpha、isascii、isblank、iscntrl、isdigit、isgraph、islower、isprint、ispunct、isspace、isupperのいずれかを使用してホワイトリストを取得するのは簡単です。 、isxdigit。この場合、一連のコースの代わりにホワイトリスト機能を使用して送信します。

通常、私はあなたがメモリ破損を探しているようなデータを見るとき、または私が期待しているエンコーディングがデータが入力されたものと異なることを示唆する証拠があります。

/アラン

2

これは、標準の文字エンコーディングを使用してデータベースに格納されているWindows文字セットを扱う文字エンコーディングの問題に不穏見慣れ。誰かがウィルに投票したのが見えますが、彼にはポイントがあります。あなたはすぐに問題を解決するかもしれませんが、これが問題であれば文字の組み合わせは無限になります。

3

非ラテン文字を削除すると、意図的に国際化サポートを壊すことになります。

名前が「â」である貧しい人を忘れないでください。

2

本当にこれを行う必要がある場合は、おそらく正規表現が最適なソリューションです。

あなたのリストが望ましくないと思われる文字の少なくともいくつかは、他の言語では完全に有効で有用であると思われますが、それらをフィルタリングするだけで、あなたの国際的なユーザーの少なくとも一部。スウェーデン語として、私はÅ、ä、öの文字を正しく処理できないの嫌いなことを強調できません。システム

1

Regex.Replace( "文字列"、 "[^ a-zA-Z]"、 "");

これは、正規表現([^ a-zA-Z])がほとんどの言語で機能するはずですが、C#でこれを行う方法です。

は、[編集:正規表現でスペースを忘れてしまった]

0

を文字列には任意のジャンク日を有する場合、これは、それは私に良い取り組んでいる方法、それらのジャンク日

string InputString = "This is grate kingdom¢Ã‚¬â"; 
string replace = "’"; 
string OutputString= Regex.Replace(InputString, replace, ""); 

//OutputString having the following result 

を削除するには良いです。

0

EXIFダンプでadobeによって投げ込まれた余分なジャンクと同じ問題がありました。私は一時間をかけてストレートな答えを探し、ここではうまくいきませんでした。

このスレッドでは、読んだほとんどのものが、「どうやってそこに着いたのですか」、「誰かが名前にこの文字を持っていたらどうですか?国際化?

このゴミがここでどのように得られ、さまざまな文字エンコーディングスキームの進化を説明することができたのか、印象的なエデュージョンの表示がありました。人はそれがどのようになったのか、標準の組織が何をしているのか、それを削除する方法を知りたいと思っていました。

私は正解をくれた小さなプログラムを書いた。代わりにメインコンセプトを言い換えの、ここでは全体の、自己完結型(少なくとも私のシステム上で)、作業プログラムがあり、出力は私が迷惑メールをNukeのために使用:それはNORMALです

#!/usr/local/bin/perl -w 

# This runs in a dos window and shows the char, integer and hex values 
# for the weird chars. Install the HEX values in the REGEXP below until 
# the final test line looks normal. 
$str = 's: “Brian'; # Nuke the 3 werid chars in front of Brian. 
@str = split(//, $str); 
printf("len str '$str' = %d, scalar \@str = %d\n", 
    length $str, scalar @str); 
$ii = -1; 
foreach $c (@str) { 
    $ii++; 
    printf("$ii) char '$c', ord=%03d, hex='%s'\n", 
     ord($c), unpack("H*", $c)); 
} 
# Take the hex characters shown above, plug them into the below regexp 
# until the junk disappears! 
($s2 = $str) =~ s/[\xE2\x80\x9C]//g; # << Insert HEX values HERE 
print("S2=>$s2<\n"); # Final test 

Result: 
M:\new\6s-2014.1031-nef.halloween>nuke_junk.pl 
len str 's: GÇ£Brian' = 11, scalar @str = 11 
0) char 's', ord=115, hex='73' 
1) char ':', ord=058, hex='3a' 
2) char ' ', ord=032, hex='20' 
3) char 'G', ord=226, hex='e2' 
4) char 'Ç', ord=128, hex='80' 
5) char '£', ord=156, hex='9c' 
6) char 'B', ord=066, hex='42' 
7) char 'r', ord=114, hex='72' 
8) char 'i', ord=105, hex='69' 
9) char 'a', ord=097, hex='61' 
10) char 'n', ord=110, hex='6e' 
S2=>s: Brian< 

!私は全体走った

もう一つの実用的な、作業の提案: のiconv -c -t ASCII < 6S-2014.1031-238246.halloween.exf.dif>

関連する問題