簡體   English   中英

Ruby'to_json'拋出ArgumentError:UTF-8中無效的字節序列

[英]Ruby 'to_json' throws ArgumentError: invalid byte sequence in UTF-8

在Rails控制台中,我得到:

hash = {"name"=>"სსიპ ოთარ ჩხეიძის სახელობის სოფელ ყე\xE1\x83"}
#=> {"name"=>"სსიპ ოთარ ჩხეიძის სახელობის სოფელ ყე\xE1\x83"}
hash.to_json
#>> ArgumentError: invalid byte sequence in UTF-8
from /home/edmodo/.rvm/gems/ruby-2.3.0@one-eye/gems/activesupport-json_encoder-1.1.0/lib/active_support/json/encoding/active_support_encoder.rb:79:in `gsub'

"\\xE1\\x83".to_json無效,可能是由於非UTF-8字符所致。

任何幫助表示贊賞。

如果將hash轉換為字符串,則可以使用它,但是會添加諸如u003E類的垃圾字符, u003E帶有許多額外的反斜杠。

hash.to_s.to_json
#=> "\"{\\\"name\\\"=\\u003E\\\"სსიპ ოთარ ჩხეიძის სახელობის სოფელ ყე\\\\xE1\\\\x83\\\"}\""

這是因為您的輸入String 在UTF-8中包含無效的字節序列 ,正如錯誤消息確切說明的那樣。 你可以像檢查

hash['name'].valid_encoding?  # => false

從根本上講,您應該修復輸入字符串,刪除所有無效的字節序列字符; 在您的示例中,它是"\\xE1\\x83"

如果出於某種原因需要保留字節序列並將其編碼為標准JSON,我認為您必須首先對字符串進行編碼,因為JSON不接受二進制數據,而僅接受有效的UTF-8字符串。 請注意,就JSON而言,具有無效字節序列的字符串是二進制數據。

在Rails中,可以使用Base64編碼,如下所示:

hash['name'] = Base64.encode64 hash['name']
hash.to_json  # => a valid JSON

在解碼時,您必須指定編碼,例如,

hj = hash.to_json
Base64.decode64(JSON.parse(hj)['name']).force_encoding('UTF-8') # => Decoded string

請注意,無論如何,您所復制的字符串都不是有效的UTF-8。 但這將有助於在Rails控制台中顯示。

如果您不怕丟失內容,可以使用以下解決方案:

pry(main)> 
{"name"=>"სსიპ ოთარ ჩხეიძის სახელობის სოფელ ყე\xE1\x83".force_encoding("ASCII-8BIT").encode('UTF-8', undef: :replace, replace: '')}.to_json

=> "{\"name\":\"     \"}"
require 'json'

def cleanup(string)
  text = ''
  string.each_char { |char| text << char if char.valid_encoding? }
  text
end

hash = { "name" => "სსიპ ოთარ ჩხეიძის სახელობის სოფელ ყე\xE1\x83" }
hash.transform_values! { |value| cleanup(value) }

puts hash.to_json

{"name":"სსიპ ოთარ ჩხეიძის სახელობის სოფელ ყე"}

謝謝Stefan,Masa Sakano和Alexey Strizhak。 您的建議對我有很大幫助。 字符串具有無效的字節序列字符是正確的。 我所做的只是保持如下所示的有效編碼字符-

"სსიპ ოთარ ჩხეიძის სახელობის სოფელ ყე\xE1\x83".chars.select(&:valid_encoding?).join
=> "სსიპ ოთარ ჩხეიძის სახელობის სოფელ ყე"

這將刪除不完整/無效的字符,例如“ \\ xE1 \\ x83”。

再次非常感謝大家幫助我了解問題並提出解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM