`
meatloaf
  • 浏览: 23189 次
  • 性别: Icon_minigender_1
  • 来自: 地狱
社区版块
存档分类
最新评论

ruby处理中文URL的办法

    博客分类:
  • ruby
阅读更多
有些工具,比如浏览器在保存html页面的时候会把其中的中文路径名转化为$#12345的这种形式,这实际上是中文字符的编码点(codepoint),一般浏览器都能够自动的处理进行转化,不看Html代码,你根本不知道存在这种转化。
但我目前有个需求,需要进行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进制了,这是个教训,呵呵。

今天把这点经验放上来,希望能帮到同样也在做这个事情的朋友。
分享到:
评论
11 楼 nail2008 2008-10-10  
偶然进入,我是搞java的,ruby一点都不懂。
最近乱码问题搞的比较多,乱码这东西是具体情况要具体分析的,不是一个方法走遍全球的。
我的感受是,并不是码乱了,而是我们用了错误的方式去解码。比如js的escape我一般是不用的,%E7%8E%8B%E5%B0%8F%E8%99%8E
10 楼 nail2008 2008-10-10  
偶然进入,我是搞java的,ruby一点都不懂。
最近乱码问题搞的比较多,乱码这东西是具体情况要具体分析的,不是一个方法走遍全球的。
我的感受是,并不是码乱了,而是我们用了错误的方式去解码。
比如js的escape我一般是不用的,encodeURIComponent告诉我打的就是Unicode的,我为什么要用escape。服务器端如果是UTF的就好说了,但是如果是GBK的,你看见的就是乱码了。乱码:????°?è??
乱了不要紧,str = java.net.URLEncoder.encode(str, "ISO-8859-1");先打回%E7%8E%8B%E5%B0%8F%E8%99%8E
str = java.net.URLDecoder.decode(str, "UTF-8");再看到的就是“王小虎”。

这个方法是准“放之四海皆准”的方式了吧,似乎可以不叼任何容器配置,页面的编码。不过我们不是民工,编程是科学,是艺术。该写filter还是要写的。
9 楼 千山我独行 2008-10-10  
收藏,也许以后能用上。
8 楼 meatloaf 2008-10-09  
Quake Wang 写道
meatloaf 写道
有些工具,比如浏览器在保存html页面的时候会把其中的中文路径名转化为$#12345的这种形式,这实际上是中文字符的编码点(codepoint),

这个不是叫codepoint,它叫html entity,有3种格式:
1. named entity,比如我们常见的用& nbsp ;来表示空格
2. 基于10进制的,就是你文章中说的,比如 & # 12345;
3. 基于16进制的,多了一个x,比如& # x12c3;
补上一段能够同时适用2和3的正则替换,来源 ( http://htmlentities.rubyforge.org/ )
gsub(/&#([0-9]{1,7});|&#x([0-9a-f]{1,6});/i) {
  $1 ? [$1.to_i].pack('U') : [$2.to_i(16)].pack('U')
}


---分割线---
发现一个Bug,JavaEye没有对&这种格式进行替换处理,赶紧去改...


很可惜,你说错了,$#\d+;这种形式的确是html entity没错,html entity中间的数字部分就叫entity number,这其实就是编码点(codepoint),而且是unicode codepoint,不过它有10进制和16进制两种形式。这部分是我欠考虑的,你给的代码例子比我的全面,谢了。

关于编码点和编码字符集的概念在国际化和本地化中是非常重要的概念,看起来即使是在javaeye这种地方,知道的人也不多啊,下面这个url,大家可以参考下http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
7 楼 wosmvp 2008-10-09  
花花公子 写道
是你自己操作系统设置的问题,改language-selector.conf

wosmvp 写道
Quake Wang 写道
meatloaf 写道
有些工具,比如浏览器在保存html页面的时候会把其中的中文路径名转化为$#12345的这种形式,这实际上是中文字符的编码点(codepoint),

这个不是叫codepoint,它叫html entity,有3种格式:
1. named entity,比如我们常见的用& nbsp ;来表示空格
2. 基于10进制的,就是你文章中说的,比如 & # 12345;
3. 基于16进制的,多了一个x,比如& # x12c3;
补上一段能够同时适用2和3的正则替换,来源 ( http://htmlentities.rubyforge.org/ )
gsub(/&#([0-9]{1,7});|&#x([0-9a-f]{1,6});/i) {
  $1 ? [$1.to_i].pack('U') : [$2.to_i(16)].pack('U')
}


---分割线---
发现一个Bug,JavaEye没有对&这种格式进行替换处理,赶紧去改...


PS:其实JE 还有个小问题,就是在英文操作系统下,UTF8…… 发帖子时字体很难看,见下图

修改textarea的CSS 加上字体类型就会好的



language-selector.conf 配置文件在那里?

可以在网页里修改,我自己写的网站就是通过这样修改的,一切正常
6 楼 花花公子 2008-10-09  
是你自己操作系统设置的问题,改language-selector.conf

wosmvp 写道
Quake Wang 写道
meatloaf 写道
有些工具,比如浏览器在保存html页面的时候会把其中的中文路径名转化为$#12345的这种形式,这实际上是中文字符的编码点(codepoint),

这个不是叫codepoint,它叫html entity,有3种格式:
1. named entity,比如我们常见的用& nbsp ;来表示空格
2. 基于10进制的,就是你文章中说的,比如 & # 12345;
3. 基于16进制的,多了一个x,比如& # x12c3;
补上一段能够同时适用2和3的正则替换,来源 ( http://htmlentities.rubyforge.org/ )
gsub(/&#([0-9]{1,7});|&#x([0-9a-f]{1,6});/i) {
  $1 ? [$1.to_i].pack('U') : [$2.to_i(16)].pack('U')
}


---分割线---
发现一个Bug,JavaEye没有对&这种格式进行替换处理,赶紧去改...


PS:其实JE 还有个小问题,就是在英文操作系统下,UTF8…… 发帖子时字体很难看,见下图

修改textarea的CSS 加上字体类型就会好的

5 楼 wosmvp 2008-10-09  
Quake Wang 写道
meatloaf 写道
有些工具,比如浏览器在保存html页面的时候会把其中的中文路径名转化为$#12345的这种形式,这实际上是中文字符的编码点(codepoint),

这个不是叫codepoint,它叫html entity,有3种格式:
1. named entity,比如我们常见的用& nbsp ;来表示空格
2. 基于10进制的,就是你文章中说的,比如 & # 12345;
3. 基于16进制的,多了一个x,比如& # x12c3;
补上一段能够同时适用2和3的正则替换,来源 ( http://htmlentities.rubyforge.org/ )
gsub(/&#([0-9]{1,7});|&#x([0-9a-f]{1,6});/i) {
  $1 ? [$1.to_i].pack('U') : [$2.to_i(16)].pack('U')
}


---分割线---
发现一个Bug,JavaEye没有对&这种格式进行替换处理,赶紧去改...


PS:其实JE 还有个小问题,就是在英文操作系统下,UTF8…… 发帖子时字体很难看,见下图

修改textarea的CSS 加上字体类型就会好的
4 楼 QuakeWang 2008-10-09  
meatloaf 写道
有些工具,比如浏览器在保存html页面的时候会把其中的中文路径名转化为$#12345的这种形式,这实际上是中文字符的编码点(codepoint),

这个不是叫codepoint,它叫html entity,有3种格式:
1. named entity,比如我们常见的用& nbsp ;来表示空格
2. 基于10进制的,就是你文章中说的,比如 & # 12345;
3. 基于16进制的,多了一个x,比如& # x12c3;
补上一段能够同时适用2和3的正则替换,来源 ( http://htmlentities.rubyforge.org/ )
gsub(/&#([0-9]{1,7});|&#x([0-9a-f]{1,6});/i) {
  $1 ? [$1.to_i].pack('U') : [$2.to_i(16)].pack('U')
}


---分割线---
发现一个Bug,JavaEye没有对&这种格式进行替换处理,赶紧去改...
3 楼 meatloaf 2008-10-09  
tangyuanjian 写道
可以用CGI.escape()

你说的完全是错误的,看来你一点都不懂编码方面的知识,而且也不自己动手实践的,你这样乱说,我很反感。
2 楼 tangyuanjian 2008-10-08  
可以用CGI.escape(),这个函数是页面传递中文的处理函数!
1 楼 yangzhihuan 2008-10-08  
大胆假设,小心求证

相关推荐

    笨办法学ruby_笨办法学ruby_ruby_bravevk4_

    《笨办法学Ruby》是一本面向初学者的Ruby编程教程,以其简单、直接的教学风格而闻名。Ruby是一种面向对象的编程语言,强调简洁和可读性,由日本人松本行弘(Yukihiro Matsumoto)于1995年创建。这本书旨在通过大量的...

    使用Ruby来处理文本的教程

    在文本处理领域,Ruby的表现尤为出色,它提供了一系列功能强大的字符串操作方法,使得处理文本数据变得简单高效。接下来,我们将详细探讨Ruby中字符串的操作方法,以及如何利用Ruby处理不同格式的文本数据,例如CSV...

    ruby语法基础教程及Ruby教程中文版和安装文件

    至于Ruby教程中文版,它将覆盖更多细节,包括类和模块、异常处理、文件操作、网络编程、Gem(Ruby的包管理系统)的使用等。通过阅读和实践教程中的例子,你可以逐步提升对Ruby的理解和应用能力。 总的来说,Ruby是...

    Ruby Data-Processing ruby数据处理

    Ruby是一种强大的动态编程语言,尤其在数据处理方面表现出色。Map、Reduce和Select是Ruby中用于操作和处理数据的关键概念,它们在数据科学、分析和软件工程领域中扮演着重要角色。 1. **Ruby Map**: Map函数允许...

    ruby图片处理工具

    Ruby 图片处理工具主要指的是利用 Ruby 语言的库来对图像进行操作,如编辑、转换、裁剪等。在这个特定的场景中,我们关注的是一个针对 Windows 操作系统的 Ruby Gem 安装包,它包含了 Rmagick 和 ImageMagick 这两个...

    Ruby新手学习书(Ruby语言中文教程)和Rails_4_days

    在Ruby语言中文教程中,你将学到以下关键知识点: 1. **基础语法**:Ruby的语法简洁明了,易于理解。包括变量(局部变量、实例变量、类变量和全局变量)、常量、数据类型(如字符串、数字、布尔值、数组、哈希)...

    ruby中文文档中心资料

    这份"ruby中文文档中心资料"包含了丰富的资源,帮助中文用户深入理解并掌握Ruby编程。 首先,"nb60_trans_old_zh_CN"可能指的是Ruby的一个版本,如NetBeans IDE 6.0的中文翻译版,NetBeans是一个流行的开源集成开发...

    ruby中文手册 chm

    Ruby中文手册CHM是为中文用户准备的详尽参考资料,包含了对Ruby语言的全面解释,帮助开发者理解和掌握这一强大的工具。 1. **Ruby用户指南**: 用户指南通常会从基础开始介绍Ruby,包括变量、数据类型、控制结构...

    Ruby:ruby错误处理教程

    Ruby:ruby错误处理教程

    ruby 中文文档 必备资料

    这份"ruby 中文文档 必备资料"压缩包包含了一份非常重要的资源——"ruby中文文档.chm",这是一份详尽的Ruby语言指南,对于学习和精通Ruby编程语言来说是不可或缺的。 首先,Ruby语言的基础知识包括变量、数据类型和...

    笨方法学ruby-中文版

    《笨方法学Ruby》是针对初学者的一本中文教程,旨在通过实践性的学习方式帮助读者掌握Ruby编程语言。这本书的特点是强调动手实践,通过一系列的练习来深化对Ruby语法和编程概念的理解。以下是对该书内容及压缩包文件...

    ruby中文资源大全

    松本行弘(Matz)是日本一家开源软件公司的程序员,有15年的编程经验。在工作中,他希望有一种比 Perl 强大,比 Python 更面向对象的语言。...本教程内含多部中文ruby介绍和语法参考能作为初中级学习使用。

    ruby中文文档.chm

    《Ruby编程语言中文文档》是针对初学者和有经验的开发者提供的一份全面而详细的资源,旨在帮助读者理解和掌握Ruby编程语言。这份文档以CHM(Microsoft编写的压缩HTML帮助文件)格式呈现,方便离线查阅。Ruby是一种...

    Ruby-一个漂亮的正则表达式用于查找和提取这些文件中的相对URL

    在Ruby编程语言中,正则表达式(Regular Expression)是一种强大的工具,用于处理字符串和文本数据,特别是查找、替换和提取特定模式。标题提到的"一个漂亮的正则表达式用于查找和提取这些文件中的相对URL"是针对...

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby入门教程中文PDF 附实例

    总之,无论你是对编程感兴趣的新手,还是想扩展技能树的开发者,这份“Ruby入门教程中文PDF 附实例”都将是你宝贵的参考资料。通过学习,你不仅可以掌握Ruby的基础知识,还能体验到编程的乐趣和效率。

    PROGRAMMING+RUBY中文版

    PROGRAMMING+RUBY中文版 PROGRAMMING+RUBY中文版 PROGRAMMING+RUBY中文版

    ruby中文 文档

    Ruby的中文文档,如“ruby中文文档.chm”,是学习和理解这一语言的重要资源。这份文档通常会包含以下关键知识点: 1. **基础语法**:Ruby的基础语法包括变量(本地变量、实例变量、类变量和全局变量)、常量、...

    Ruby中文文档

    Ruby是一种功能强大的面向对象的脚本语言,她可以使您方便快捷地进行面向对象编程.Ruby使文本处理和系统管理变得简单,与Perl非常相似.一句话:简单明了,扩展性强,移植性好. Ruby的几大亮点: 语法简单 垃圾回收 ...

    Ruby语言中文教程.rar

    Ruby是一种面向对象的、动态类型的编程语言,以其...总的来说,这个“Ruby语言中文教程”涵盖了从入门到进阶的全面内容,无论你是编程新手还是想转战Ruby的开发者,都能从中受益匪浅,逐步成为一名熟练的Ruby程序员。

Global site tag (gtag.js) - Google Analytics