18

私は非常にシンプルで非常に必要な方法のようです。文字列からすべての非 ASCII 文字を削除する必要があります。例: © など。次の例を参照してください。

#coding: utf-8
s = " Hello this a mixed string © that I made."
puts s.encoding
puts s.encode

出力:

UTF-8
Hello this a mixed str

私が作った┬⌐です。

これを Watir に渡すと、次のエラーが生成されます: 互換性のない文字エンコーディング: UTF-8 および ASCII-8BIT

だから私の問題は、それを使用する前にすべての非ASCII文字を取り除きたいということです。ソース文字列「s」がどのエンコーディングを使用しているかはわかりません。

私はかなり長い間検索して実験してきました。

使おうとしたら

  puts s.encode('ASCII-8BIT')

エラーが発生します:

 : "\xC2\xA9" from UTF-8 to ASCII-8BIT (Encoding::UndefinedConversionError)
4

3 に答える 3

42

あなたが尋ねたものを文字通りに翻訳することができますRegexp。あなたが書いた:

すべての非 ASCII 文字を削除したい

それを少し言い換えることができます:

ASCIIプロパティを持たないすべての文字を何も置換したくない

これは、次のように直接表現できるステートメントですRegexp

s.gsub!(/\P{ASCII}/, '')

代わりに、次を使用することもできますString#delete!

s.delete!("^\u{0000}-\u{007F}")
于 2010-07-08T09:07:12.663 に答える
2

正規表現を使用して文字を取り除きます。この例はC#ですが、正規表現は同じである必要があり ます。文字列から非ASCII文字を削除するにはどうすればよいですか。(C#で)

gsubを使用してそれをrubyに変換することは難しくありません。

于 2010-07-08T04:13:05.973 に答える
1

UTF-8 は可変長エンコーディングです。文字が 1 バイトを占める場合、その値は 7 ビット ASCII と一致します。では、MSB が「1」のバイトを探して、それらとそのトレーラーの両方を削除してみませんか? 「110」で始まるバイトの後に 1 バイトが追加されます。「1110」で始まるバイトの後に 2 バイトが続きます。また、'11110' で始まるバイトの後には、UTF-8 でサポートされる最大数である 3 つのバイトが続きます。

これはすべて私の頭のてっぺんから外れています。私は間違っているかもしれません。

于 2010-07-08T04:10:57.803 に答える