Tag: utf 8

Ruby转换字符串编码从ISO-8859-1到UTF-8不起作用

我试图将一个字符串从ISO-8859-1编码转换为UTF-8,但我似乎无法让它工作。 这是我在irb中所做的一个例子。 irb(main):050:0> string = ‘Norrlandsvägen’ => “Norrlandsvägen” irb(main):051:0> string.force_encoding(‘iso-8859-1’) => “Norrlandsv\xC3\xA4gen” irb(main):052:0> string = string.encode(‘utf-8’) => “Norrlandsvägen” 我不确定为什么iso-8859-1中的Norrlandsvägen将在utf-8中转换为Norrlandsvägen 。 我已经尝试过编码,编码!,编码(destinationEncoding,originalEncoding),iconv,force_encoding,以及我能想到的各种奇怪的解决方法,但似乎没有任何效果。 有人可以帮助我/指出我正确的方向吗? Ruby新手仍然像疯了一样拉头发,但感谢所有回复… 🙂 这个问题的背景:我正在编写一个gem,它将从一些网站下载一个xml文件(将具有iso-8859-1编码)并将其保存在存储中,我想先将其转换为utf-8。 但像Norrlandsvägen这样的词语让我感到困惑 。 真的任何帮助将不胜感激! [更新]:我意识到在irb控制台中运行这样的测试可能会给我不同的行为,所以这里是我在实际代码中的内容: def convert_encoding(string, originalEncoding) puts “#{string.encoding}” # ASCII-8BIT string.encode(originalEncoding) puts “#{string.encoding}” # still ASCII-8BIT string.encode!(‘utf-8’) end 但最后一行给出了以下错误: Encoding::UndefinedConversionError – “\xC3” from ASCII-8BIT to UTF-8 感谢\xC3在下面的回答,我注意到如果你运行的话, \xC3实际上会显示在irb中: irb(main):001:0> […]

在RoR中对UTF-8字符串进行排序

我试图找出一种在Ruby on Rails中对UTF-8字符串进行排序的“正确”方法。 在我的应用程序中,我有一个填充了国家/地区的选择框。 由于我的应用程序已本地化,因此每个现有语言环境都有一个countries.yml文件,该文件将国家/地区的ID与该国家/地区的本地化名称相关联。 我无法在yml文件中手动对字符串进行排序,因为我需要ID在所有语言环境中保持一致。 我所做的是创建一个ascii_name方法,它使用unidecode gem将重音和非拉丁字符转换为它们的ascii等价物(例如,“Afeganistão”将成为“Afeganistao”),然后排序: require ‘unidecode’ class Country def ascii_name Unidecoder.decode(name).gsub(“[?]”, “”).gsub(/`/, “‘”).strip end end Country.all.sort_by(:&ascii_name) 但是,这有明显的问题: 它无法正确排序非拉丁语区域设置,因为可能没有直接类似的拉丁字符。 它没有区分字母和该字母的所有重音forms(例如,A和Ä可以互换) 有谁知道一种更好的方法,我可以排序我的字符串?

Rails:使用序列化哈希编码问题,尽管UTF8

我刚刚从ruby 1.9.2更新到ruby 1.9.3p0(2011-10-30修订版33570)。 我的rails应用程序使用postgresql作为其数据库后端。 系统区域设置是UTF8,数据库编码也是如此。 rails应用程序的默认编码也是UTF8。 我有中国用户输入汉字和英文字符。 字符串存储为UTF8编码的字符串。 Rails版本:3.0.9 由于更新,数据库中的一些现有中文字符串不再正确显示。 这不会影响所有字符串,只会影响序列化哈希的一部分。 存储为纯字符串的所有其他字符串仍然看起来是正确的。 例: 这是一个序列化哈希,在数据库中存储为UTF8字符串: broken = “— !map:ActiveSupport::HashWithIndifferentAccess \ncheckbox: \”1\”\nchoice: \”Round Paper Clips \\xEF\\xBC\\x88\\xE5\\x9B\\x9E\\xE5\\xBD\\xA2\\xE9\\x92\\x88\\xEF\\xBC\\x89\\r\\n\”\ninfo: \”10\\xE7\\x9B\\x92\”\n” 为了将此字符串转换为ruby哈希,我使用YAML.load反序列化它: broken_hash = YAML.load(broken) 这将返回带有乱码内容的哈希: {“checkbox”=>”1”, “choice”=>”Round Paper Clips ï¼\u0088å\u009B\u009Eå½¢é\u0092\u0088ï¼\u0089\r\n”, “info”=>”10ç\u009B\u0092”} 乱码的东西应该是UTF8编码的中文。 broken_hash[‘info’].encoding告诉我ruby认为这是# 。 我不同意。 有趣的是,之前没有序列化的所有其他字符串看起来都很好。 在同一记录中,不同的字段包含看起来正确的中文字符—在rails控制台,psql控制台和浏览器中。 每个字符串—无论是序列化哈希还是普通字符串—都保存到数据库中,因为更新看起来也很好。 我试图将乱码文本从可能的错误编码(如GB2312或ANSI)转换为UTF-8,尽管ruby声称这已经是UTF-8了,当然我失败了。 这是我使用的代码: require ‘iconv’ Iconv.conv(‘UTF-8’, ‘GB2312’, broken_hash[‘info’]) 这失败了,因为ruby不知道如何处理字符串中的非法序列。 我真的只想运行一个脚本来修复所有旧的,可能是破坏的序列化哈希字符串并完成它。 有没有办法将这些断弦转换成类似中文的东西? 我只是在原始字符串中使用编码的UTF-8字符串(在上面的示例中称为“已损坏”)。 这是在序列化字符串中编码的中文字符串: […]

将UTF-8设置为Ruby 1.9.3的默认值

我在Rails 4和Ruby 1.9.3上 我经常使用“奇怪”字符,所以我必须在所有.rb文件的顶部声明UTF-8编码。 有没有办法将UTF-8设置为Ruby 1.9.3的默认编码? 我尝试了所有答案,但是当运行rake db:seed并创建一个属性包含非US-ASCII有效字符的对象时,我仍然收到此错误: `block in trace_on’: invalid byte sequence in US-ASCII (ArgumentError)

将不间断空格转换为Ruby中的空格

我有一些情况,当编码为utf-8 json时,来自html textarea或输入的用户输入数据有时会以\u00a0 (非中断空格)而不是空格发送。 我认为这是Firefox中的一个错误,因为我知道用户不是故意放入不间断的空格而不是空格。 Ruby中还有两个错误,其中一个可以用来对抗另一个。 无论出于什么原因, \s都不匹配\u00a0 。 但是[^[:print:]] ,绝对不应该匹配)和\xC2\xA0都匹配,但我认为那些是不太理想的方法来处理这个问题。 是否有其他建议可以解决这个问题?

我可以在Ruby 1.9上设置默认字符串编码吗?

这可能听起来很小,但它让我疯了。 自上周五在Ruby 1.9上将应用程序发布到生产以来,我一直有很多与字符编码有关的小例外。 几乎所有这些都是一些变化: Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8 我们有一个国际用户群,所以很多名字都包含变音符号等。如果我修复模板在一堆地方使用force_encoding ,它会弹出flash消息助手。 等等。 目前看起来我已经确定了我所知道的所有内容,通过在一个地方修补ActiveSupport的字符串连接,然后在每个源文件的顶部设置#coding # encoding: utf-8 。 但是,我可能必须记住为我从现在开始的每个Ruby项目的每个文件都做到这一点的感觉,永远,只是为了避免字符串分配问题,并不适合我的胃。 我读到了关于-Ku开关的信息,但是所有内容似乎都警告说这是为了向后兼容并且可能随时消失。 所以我对1.9经验丰富的人提出的问题是:在我的每个文件中设置#encoding 真的有必要吗? 在全球范围内有合理的方法吗? 或者,更好的方法是在绕过内部/外部默认值的字符串的非文字值上设置默认编码? 在此先感谢您的任何建议。

ruby`coding’:“\ xC3”从ASCII-8BIT到UTF-8(Encoding :: UndefinedConversionError)

tvdb中的汉尼拔剧集中有奇怪的人物。 例如: Œuf 所以ruby吐出来: ./manifesto.rb:19:in `encode’: “\xC3” from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError) from ./manifesto.rb:19:in `to_json’ from ./manifesto.rb:19:in `’ 第19行是: puts @tree.to_json 有没有办法处理这些非utf字符? 我宁愿不更换它们,而是转换它们? 还是忽略它们? 我不知道,任何帮助表示赞赏。 奇怪的是,脚本通过cron工作正常。 手动运行它会产生错误。

ruby 1.9 + sinatra不兼容的字符编码:ASCII-8BIT和UTF-8

我正在尝试将sinatra应用程序迁移到ruby 1.9 我正在使用sinatra 1.0,机架1.2.0和erb模板 当我启动sinatra它工作,但当我从浏览器请求网页时,我收到此错误: Encoding::CompatibilityError at / incompatible character encodings: ASCII-8BIT and UTF-8 所有.rb文件都有这个标题: #!/usr/bin/env ruby # encoding: utf-8 我认为问题出现在erb文件中,即使它表明它是UTF-8编码的 [user@localhost views]$ file home.erb home.erb: UTF-8 Unicode text 以前有人有这个问题吗? sinatra与ruby 1.9不完全兼容?

字符串#coding不修复“UTF-8中的无效字节序列”错误

我知道关于这个错误有很多类似的问题,我已经尝试了很多没有运气的问题。 我遇到的问题涉及字节\xA1并且正在抛出 ArgumentError:UTF-8中的无效字节序列 我试过以下但没有成功: “\xA1”.encode(‘UTF-8’, :undef => :replace, :invalid => :replace, :replace => “”).sub(”, ”) “\xA1”.encode(‘UTF-8’, :undef => :replace, :invalid => :replace, :replace => “”).force_encoding(‘UTF-8’).sub(”, ”) “\xA1”.encode(‘UTF-8’, :undef => :replace, :invalid => :replace, :replace => “”).encode(‘UTF-8’).sub(”, ”) 每一行都为我抛出错误。 我究竟做错了什么? 更新: 上述行仅在IRB中失败。 但是,我修改了我的应用程序,使用相同的String#encode方法和参数对CVS文件的行进行编码,从文件中读取行时出现相同的错误(注意:如果对同一个字符串执行操作,它会起作用没有使用IO)。 bad_line = “col1\tcol2\tbad\xa1″ bad_line.sub(”, ”) # does NOT fail puts bad_line # => […]

在所有文件中添加“#coding:utf-8”

我能以某种方式配置Rails以避免需要在所有文件中添加# coding: utf-8吗? 或者我必须手动将其添加到每个文件? UPD 为了改善我的生活,我发现了这个gem: magic_encoding 它不会解决问题,但它会为每个文件添加magick线。 相关主题: 为什么升级到Rails 3后所有字符串都是ASCII-8BIT?