6

私は本番環境のどこかにアクセスできないファイルを持っています.Rubyスクリプトでロードすると、内容に対する正規表現はArgumentError => invalid byte sequence in UTF-8.

ここにすべてのポイントがある回答に基づいて修正したと思います: ruby​​ 1.9: UTF-8 の無効なバイト シーケンス

# Remove all invalid and undefined characters in the given string
# (ruby 1.9.3)
def safe_str str

  # edited based on matt's comment (thanks matt)
  s = str.encode('utf-16', 'utf-8', invalid: :replace, undef: :replace, replace: '')
  s.encode!('utf-8', 'utf-16')
end

ただし、rspec をビルドして、コードが機能することを確認したいと考えています。問題の原因となったファイルにアクセスできないため、プログラムでエンコードの悪い文字列を作成したいと考えています。

次のようなバリエーションを試しました:

bad_str = (100..1000).to_a.inject('') {|s,c| s << c; s}
bad_str.length.should > safe_str(bad_str).length

また、

bad_str = (100..1000).to_a.pack(c*)
bad_str.length.should > safe_str(bad_str).length

しかし、長さは常に同じです。また、さまざまな文字範囲を試しました。常に 100 から 1000 ではありません。

Ruby 1.9.3 スクリプト内で無効なエンコーディングを使用して文字列を作成する方法について何か提案はありますか?

4

5 に答える 5

4

1 バイト文字列が多いと、0x80 で始まる無効な UTF-8 文字列になります。だから128.chrうまくいくはずです。

于 2013-08-14T18:33:20.297 に答える
2

試してみてくださいs = "hi \255"

s.valid_encoding?
# => false
于 2020-07-23T09:33:53.150 に答える
0

私が書いた仕様テストでは、この悪いエンコーディングを修正する方法が見つかりませんでした:

期間%基本

文字列は%B一貫して生成されますArgumentError: invalid byte sequence in UTF-8

于 2013-08-14T18:58:21.487 に答える