web-dev-qa-db-ja.com

ランダムなWebサイトやその他の場所に表示されるキリル文字の非常に奇妙な意味不明の文字列

オンライン注文の仕事で、いくつかの注文で極端な異常に気づき始めました。制限されていなかった1つのフィールドには、300万文字を超える文字列が出現しました。 Pythonを使用して詳細に調べたところ、実際には、そのような意味不明な文字列の1000以上のリストであることがわかりました。私はさらに掘り下げて、そのインスタンスをさらに見つけました。18000を超えるリスト要素で構成される5800万文字を超える文字列で最悪です。

したがって、文字列のいくつかのリストで構成される文字列があり、これらの文字列も改行しないスペースで区切られた意味不明な単語で構成されています。

例(読みやすくするために改行を追加しました):

'Р В Р’ВР
 ’ Р В РІР‚в„ўР вР
 ‚™Р’В Р В Р’В Р Р
  вЂ Р В РІР‚љРІвЂћСћР Р
 ’ РІР‚™Р’ВР
 ’ Р В Р’ Р’РВ
 ’ Р Р†Р РР
 †Р вЂљРЎв„ўР В Р вЂ Р Р†Р вЂљРЎвЂєР Р
 ЋРЎвЂєР В Р’ Р’ РІРР
 ІР‚љРІвЂћСћР В РІРВ
 ‚™Р’В РРвЂ

以下は、5,800万の文字列で最も一般的な10の単語の数です。

Р                     2453256
В                     1926812
Р’В                    895699
’В                 822674
ІР                   399677
РІР‚в„ўР               382349
†                    235180
‚Р              185503
‚в„ўР           177792
†                 109266
ІвЂћСћР         101490

今、例えば文字列「РІР‚в„ўР」をGoogleに挿入します。これらの文字列がサイトのソースコードに挿入されている、一見ランダムに見える100万を超えるサイトを取得しています。

私はこれをどうすればいいのか全くわかりませんが、誰かこれが何であるか知っていますか?

6
Khris

@Deunisの助けを借りて、私はここで何が起こっているのかを見つけました。

Utf8で少なくとも2バイトで表される特殊文字を取得すると、それをutf8としてデコードし、cp1251(キリル文字)としてエンコードすると、吹き飛ばされます。それを繰り返し行うと、文字列は長くなり、それらのWebサイトで観察された正確なパターンを示します。以下は、これらのパターンを再現するコードの例ですPythonコード:

def encode_decode(s,e1,e2):
    t = s.encode(e1)
    o = t.decode(e2)
    return o

e1 = "cp1251"
e2 = "utf_8"
char = 'ä'
iterations = 6

print(char)
print(40*'-')
for _ in range(iterations):
    char = encode_decode(char,e2,e1)
    print(char)
    print(40*'-')
for _ in range(iterations):
    char = encode_decode(char,e1,e2)
    print(char)
    print(40*'-')

これは出力を生成します:

ä
----------------------------------------
Г¤
----------------------------------------
Г¤
----------------------------------------
Г¤
----------------------------------------
Г¤
----------------------------------------
Г¤
----------------------------------------
Г¤
----------------------------------------
Г¤
----------------------------------------
Г¤
----------------------------------------
Г¤
----------------------------------------
Г¤
----------------------------------------
Г¤
----------------------------------------
ä
----------------------------------------
1
Khris

あなたと同じ問題のあるウェブサイトを探していました。

それらの1つはフランスのウェブサイトであり、ここにその中のテキストがあります。

Mon banquier nemРВВЂЂССљв„ў appelle plus pour mondРвГВР'В©couvert、nousР“ВР'В ©changeonsdorР“ВР'В©navant sur mes nouveaux projets

英数字以外の文字(a-z/A-Z以外)は「キリル文字」に置き換えられます。このテキストには '、é...

この場合、マルチバイト文字が複数のユニバイト文字と見なされるASCIIエンコードの問題のように見えます。したがって、2バイト文字は2つの1バイト文字になります。

私はあちこち歩き回って、それがデータベースエンコーディングデータベース形式にリンクできることを発見しました。しかし、私はデータベースの専門家ではないので、より詳しい知識を持った人が説明を完了することができます。

したがって、@ james-k-polkが言ったように、表示されている文字は文字として表示されるべきではないか、私の意見ではzはある形式から別の形式に変換されているだけです。

1
Deunis