10

文字列の途中に印刷できない悪意のある文字が含まれていることがあります。これらの文字列はユーザ​​ー入力であるため、問題の原因を変えようとするのではなく、プログラムが正しく受信できるようにする必要があります。

たとえば、文字列の途中にゼロ幅の改行なしスペースを含めることができます。たとえば、ファイルを解析しているときに問題があったのは、ファイルの途中にある文字列でした。すべてが正しいように見えますが、ショーで検査すると次のようになります。.po"he is a man of god"irb

 "he is a man of god".codepoints
 => [104, 101, 32, 105, 115, 32, 97, 32, 65279, 109, 97, 110, 32, 111, 102, 32, 103, 111, 100] 

私は a が何であるかを知っていると信じておりBOM、それをうまく処理しています。ただし、ファイルの途中にそのような文字がある場合があるため、BOM.

私の現在のアプローチは、私が本当に悪臭を放つ方法で悪を見つけたすべてのキャラクターを削除することです:

text = (text.codepoints - CODEPOINTS_BlACKLIST).pack("U*")

私が得た最も近いものは、正規表現のオプションにつながったこの投稿に従うことでした。:print:しかし、それは私にとっては良くありませんでした:

"m".scan(/[[:print:]]/).join.codepoints
 => [65279, 109] 

質問は次のとおりです:ルビの文字列からすべての印刷不可能な文字を削除するにはどうすればよいですか?

4

3 に答える 3

21

これを試して:

>>"aaa\f\d\x00abcd".gsub(/[^[:print:]]/,'.')
=>"aaa.d.abcd"
于 2014-07-17T08:02:10.610 に答える
1

Ruby は、あるマルチバイト文字セットから別の文字セットに変換するのに役立ちます。検索結果を確認し、Ruby String のencodeメソッドを読んでください。

また、Ruby のIconvはあなたの味方です。

最後に、James Gray が一連の記事を書き、これを詳しく説明しています。

これらのツールを使用してできることの 1 つは、視覚的に類似した文字にトランスコードするか、完全に無視するように指示することです。

代替文字セットを扱うことは、私がこれまでにやらなければならなかった最も苛立たしいことの 1 つです。なぜなら、ファイルには何でも含めることができますが、テキストとしてマークすることができるからです。コンテンツに別の文字を挿入する方法を考え出すとき、人々は非常に独創的であるため、コードが停止するか、エラーをスローし始めるとは思わないかもしれません。

于 2013-05-13T19:59:20.920 に答える