このような種類のシンボル(ジャンク)を文字列から削除するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/72677

  •  09-06-2019
  •  | 
  •  

質問

C# で String があると想像してください。「会えないよ…」

これらの「アア」記号を削除(何もないものに置き換えるなど)したいと考えています。

どうすればいいでしょうか?

役に立ちましたか?

解決

その「ジャンク」は、おそらく誰かが 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、右単一引用符 (’) である必要があります。

バイト配列、Encoding.UTF8 および Encoding.GetEncoding(1252) を使用して複数のパスを作成すると、ジャンクを元の入力内容に正しく戻すことができます。処理をチェックして、UTF-8 データが Windows-1252 として誤って解釈された 2 つの場所を見つける必要があります。

他のヒント

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

そもそもそのゴミがどうやってそこに入ったのでしょうか?それが本当の質問です。

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

名前に「â」が含まれている可哀そうな男を忘れないでください。

これは、標準の文字エンコーディングを使用してデータベースに格納されている Windows 文字セットを扱う文字エンコーディングの問題に、不気味なほどよく似ているように見えます。誰かがウィルに反対票を投じたのを見たけど、彼の言うことも一理ある。当面の問題は解決しているかもしれませんが、これが問題である場合、文字の組み合わせは無限です。

これを本当に行う必要がある場合は、正規表現を使用するのがおそらく最良の解決策です。

ただし、なぜこれを行う必要があるのか​​を考えることを強くお勧めします。望ましくないものとしてリストした文字の少なくとも一部は、他の言語では完全に有効で有用であり、それらをフィルターで除外するだけで、少なくとも一部の言語に不快感を与える可能性が高くなります。国際的なユーザー。スウェーデン人として、私がどれだけ強調しても足りません。 嫌い システムでは、å、ä、ö の文字を正しく処理できません。

Regex.Replace(your_string, regex, "") を考えてみましょう - それが私が使用しているものです。

各文字を順番にテストして、それが有効な英字または数字であるかどうかを確認し、そうでない場合は文字列から削除します。性格テストは非常に簡単です。ただ使用するだけです。

char.IsLetterOrDigit;

他にも色々ありますのでどうぞ・・・

char.IsSymbol;
char.IsControl;

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

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

[編集:正規表現内のスペースを忘れました]

これらの文字の ASCII / 整数コードは、通常のアルファベットの範囲外になります。検索して空の文字に置き換えます。String には Replace メソッドがあると思います。

不要なもののブラックリストを使用するか、できればホワイト リスト (セット) を使用します。ホワイト リストを使用すると、文字列を反復処理し、ホワイト リストにある文字のみを結果の文字列にコピーします。削除すると言いましたが、その方法は、2 つのポインターを用意し、1 つは読み取り (R) から、もう 1 つは書き込み (W) に行うことです。

I Donââ‚
     W  R

ホワイトリストにカンマが含まれている場合、この場合はカンマを読み取り、Ã の位置に書き込み、両方のポインタを進めます。UTF-8 はマルチバイト エンコーディングであるため、ポインタを進めることは単にアドレスに追加するだけではない可能性があります。

C では、事前定義された関数 (またはマクロ) のいずれかを使用して、ホワイト リストを簡単に取得できます。isalnum、isalpha、isascii、isblank、iscntrl、isdigital、isgraph、islower、isprint、ispunct、isspace、isupper、isxdigital。この場合、コースのセットではなく、ホワイト リスト機能を使用して送信します。

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

/アラン

Adobe によって EXIF ダンプに投げ込まれた無関係なジャンクについても、同じ問題が発生しました。私は明確な答えを探して 1 時間を費やし、ここでは機能しなかった中途半端な提案を数多く試しました。

このスレッドは、私がこれまでに読んだどのスレッドよりも、「どうやってそこにたどり着いたのですか?」、「誰かの名前にこの文字が入っていたらどうしますか?」、「国際化を破る気はありますか?」などの、深くて鋭い質問でいっぱいでした。

このジャンクがどのようにしてここに来たのかを推測し、さまざまな文字エンコード方式の進化を説明する博識な印象的な展示がいくつかありました。この人が知りたかったのは、それがどのようになったのか、標準化団体が何をしようとしているのかではなく、それを削除する方法を知りたいということでした。この雑学は興味深いかもしれませんが。

私は正しい答えを与える小さなプログラムを書きました。主要な概念を言い換える代わりに、自己完結型で動作する (少なくとも私のシステムでは) プログラム全体と、ジャンクを破壊するために使用した出力を次に示します。

#!/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<

それは正常です!!!

私が見つけたもう 1 つの実用的で実用的な提案は次のとおりです。iconv -c -t ASCII < 6s-2014.1031-238246.halloween.exf.dif > exf.ascii.dif

文字列にジャンク日付がある場合、これはそれらのジャンク日付を削除するのに適しています

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

     //OutputString having the following result 

私にとってはうまく機能しています。このレビューをご覧いただきありがとうございます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top