有些工具,比如浏览器在保存html页面的时候会把其中的中文路径名转化为$#12345的这种形式,这实际上是中文字符的编码点(codepoint),一般浏览器都能够自动的处理进行转化,不看Html代码,你根本不知道存在这种转化。
但我目前有个需求,需要进行html的解析,并且要和本地目录进行比较,因此就需要在ruby中把这种使用编码点的url字符串转化为字符。
比如下面这个url
一开始,考虑用unpack来做
控制台的编码方式是gbk,这时输出是乱码,尝试进行转码
没想到输出是一样的
忽然想到java里面的做法
但是ruby并不支持unicode的编码点,因此ruby中int类型的to_char方法最大到256,这样也行不通。
于是想到用jruby来绕过这个转换的过程
这个代码是可以运行的了。
又过了好几天,忽然又想到问题可能是处在对编码点的理解上,一开始用的是16进制,应该使用十进制的,于是又试了一下,问题解决了
其实,一开始就应该想到这个url是用十进制表示的编码点的,惯性思维,一看到编码点就直接用16进制了,这是个教训,呵呵。
今天把这点经验放上来,希望能帮到同样也在做这个事情的朋友。
但我目前有个需求,需要进行html的解析,并且要和本地目录进行比较,因此就需要在ruby中把这种使用编码点的url字符串转化为字符。
比如下面这个url
src="./冰酷一夏.files/gif-0268.gif"
一开始,考虑用unpack来做
str = path.gsub(/&#(\d+);/) { |s| [$1.to_i(16)].pack("U") }
puts str
控制台的编码方式是gbk,这时输出是乱码,尝试进行转码
path = "./冰酷一夏.files/gif-0268.gif"
str = path.gsub(/&#(\d+);/) { |s| [$1.to_i(16)].pack("U") }
puts str
require "iconv"
puts Iconv.conv("gbk", "utf-8", str)
没想到输出是一样的
./馉鸱埞饳エ稷灆.files/gif-0268.gif
./馉鸱埞饳エ稷灆.files/gif-0268.gif
忽然想到java里面的做法
//str是通过正则表达式取出的数字,这样做是可以的
(char)Integer.valueof(str).intValue()
但是ruby并不支持unicode的编码点,因此ruby中int类型的to_char方法最大到256,这样也行不通。
于是想到用jruby来绕过这个转换的过程
i = Ja::Integer.new(number)
c = Ja::Character.new(i.intValue())
Ja::String.valueOf(c)
这个代码是可以运行的了。
又过了好几天,忽然又想到问题可能是处在对编码点的理解上,一开始用的是16进制,应该使用十进制的,于是又试了一下,问题解决了
str = path.gsub(/&#(\d+);/) { |s| [$1.to_i(10)].pack("U") }
puts str
require "iconv"
puts Iconv.conv("gbk", "utf-8", str)
其实,一开始就应该想到这个url是用十进制表示的编码点的,惯性思维,一看到编码点就直接用16进制了,这是个教训,呵呵。
今天把这点经验放上来,希望能帮到同样也在做这个事情的朋友。