如何检查字符串是否包含ASCII代码

时间:2015-06-22 21:41:31

标签: ruby string utf-8

给定一个字符串A\xC3B,可以通过执行此操作将其转换为utf-8字符串(ref link):

"A\xC3B".force_encoding('iso-8859-1').encode('utf-8') #=> "AÃB"

但是,如果字符串包含ASCII代码,即\xC3,我只想执行操作。我该如何检查?

尝试"A\xC3B".include?("\x"),但它无法正常工作。

2 个答案:

答案 0 :(得分:5)

\x只是一个十六进制转义序列。它与编码本身无关。 US-ASCII从"\x00"变为"\x7F"(例如"\x41""A"相同,"\x30""0")。其余的("\x80""\xFF")不是US-ASCII字符,因为它是一个7位字符集。

如果要检查字符串是否仅包含US-ASCII字符,请致电String#ascii_only?

p "A\xC3B".ascii_only? # => false
p "\x41BC".ascii_only? # => true

另一个基于您的代码的示例:

str = "A\xC3B"
unless str.ascii_only?
  str.force_encoding(Encoding::ISO_8859_1).encode!(Encoding::UTF_8)
end
p str.encoding # => #<Encoding:UTF-8>

答案 1 :(得分:1)

我认为你想要做的是弄清楚你的字符串是否被正确编码。处理非Ascii字符串时ascii_only?解决方案没什么帮助。

我会使用String#valid_encoding?验证字符串是否已正确编码,即使它包含非ASCII字符。

例如,如果其他人以正确的方式编码"Françoise Paré",当我解码它时,我会得到正确的字符串而不是"Fran\xE7oise Par\xE9"(如果有人将其编码为ISO-8859-1)。

[62] pry(main)> "Françoise Paré".encode("utf-8").valid_encoding?
=> true

[63] pry(main)> "Françoise Paré".encode("iso-8859-1")
=> "Fran\xE7oise Par\xE9"

# Note the encoding is still valid, it's just the way IRB displays
# ISO-8859-1

[64] pry(main)> "Françoise Paré".encode("iso-8859-1").valid_encoding?
=> true

# Now let's interpret our 8859 string as UTF-8. In the following
# line, the string bytes don't change, `force_encoding` just makes
# Ruby interpret those same bytes as UTF-8.

[65] pry(main)> "Françoise Paré".encode("iso-8859-1").force_encoding("utf-8")
=> "Fran\xE7oise Par\xE9"

# Is a lone \xE7 valid UTF-8? Nope.

[66] pry(main)> "Françoise Paré".encode("iso-8859-1").force_encoding("utf-8").valid_encoding?
=> false