Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 编码时保留未定义的字符_Ruby_Encoding_Utf 8_Windows 1252 - Fatal编程技术网

Ruby 编码时保留未定义的字符

Ruby 编码时保留未定义的字符,ruby,encoding,utf-8,windows-1252,Ruby,Encoding,Utf 8,Windows 1252,这里我从dbãƒ\u008F外部获得了一个字符串,我想将它转换回unicode字符。我知道数据库使用的是windows-1252编码,因此实际字符应该是\xe3\x83\x8f,即ハ采用utf-8编码 以下是我迄今为止尝试过的东西 "ãƒ\u008F".encode('windows-1252') # => Encoding::UndefinedConversionError: U+008F to WINDOWS-1252 in conversion from UTF-8 to WINDO

这里我从db
ãƒ\u008F
外部获得了一个字符串,我想将它转换回unicode字符。我知道数据库使用的是
windows-1252
编码,因此实际字符应该是
\xe3\x83\x8f
,即
采用utf-8编码

以下是我迄今为止尝试过的东西

"ãƒ\u008F".encode('windows-1252')
# => Encoding::UndefinedConversionError: U+008F to WINDOWS-1252 in conversion from UTF-8 to WINDOWS-1252

"ãƒ\u008F".encode('windows-1252', undef: :replace)
# => "\xE3\x83?"
这是合理的,因为
0x8f
windows-1252
的代码页中没有定义

----------Windows-1252-----------
  0 1 2 3 4 5 6 7 8 9 a b c d e f
2   ! " # $ % & ' ( ) * + , - . /
3 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4 @ A B C D E F G H I J K L M N O
5 P Q R S T U V W X Y Z [ \ ] ^ _
6 ` a b c d e f g h i j k l m n o
7 p q r s t u v w x y z { | } ~ 
8 € � ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ � Ž � <---right here!
9 � ‘ ’ “ ” • – — ˜ ™ š › œ � ž Ÿ
a   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯
b ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿
c À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
d Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
e à á â ã ä å æ ç è é ê ë ì í î ï
f ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

我想我对这里发生的事情有一个模糊的概念,但我很难做出正确的解释。然而,这里有一个解决方案至少适用于您的一个示例:

str = "ãƒ\u008F"
str2 = str.chars.map {|c| c.encode('windows-1252').ord rescue c.ord }
         .pack('C*').force_encoding('utf-8')
puts str2
# => ハ

当然,这对于大型文本来说效率很低,但希望它能有所帮助。如果我稍后有足够的资金,我会回来尝试添加更好的解释。

你指的是一个?类型字符,通常表示无效。有,所以把它编码成那样是个错误。为什么不使用
force_编码
?如果字符串已经具有UTF-8表示形式的正确字节,那么解决方案是(如@tadman所说)执行
str.force_编码('UTF-8')
。这就是所有必要的。如果实际字节已经正确,就不应该使用
encode
。@Jordan,问题是字符串的表示形式是
Þƒ\u008F
“Þƒ\u008F”。强制编码('utf-8')
仍然是
Þƒ\u008F
实际字节值是多少,十进制还是十六进制,问题是,字符串的表示形式是ãƒ\u008F——您这样说就像字符串有一个表示形式一样。我说字符串的表示形式是
。谁是对的?您的数据库正在使用带有Windows-1252镜头的相机拍摄原始字节。我正在使用一个带有UTF-8镜头的相机来拍摄原始字节的照片。这个想法是为你的相机选择合适的镜头。force_encoding()将允许您选择正确的镜头,以了解您在这里所做的事情。从windows-1252获取作战需求文件,并使用自己的作战需求文件进行救援。希望有更好的办法。
str = "ãƒ\u008F"
str2 = str.chars.map {|c| c.encode('windows-1252').ord rescue c.ord }
         .pack('C*').force_encoding('utf-8')
puts str2
# => ハ