Ruby编码替换错误

Ruby编码替换错误,ruby,string,ascii,encode,Ruby,String,Ascii,Encode,我正在尝试读取一个文本文件,其中包含许多带有重音符号(标点符号)的字符串,并使用Ruby(非Rails)用这些没有重音符号的字符串填充数据库 例如,我有: 在临时会议上发言 我想替换整行,使其具有以下字符串: 这是一个临时事件 因此,我找到了一种可行的方法: def convert_to_ascii(s) undefined = '' fallback = { 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'

我正在尝试读取一个文本文件,其中包含许多带有重音符号(标点符号)的字符串,并使用Ruby(非Rails)用这些没有重音符号的字符串填充数据库

例如,我有:

在临时会议上发言

我想替换整行,使其具有以下字符串:

这是一个临时事件

因此,我找到了一种可行的方法:

    def convert_to_ascii(s)
        undefined = ''
        fallback = { 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A',
                   'Å'=>'A', 'Æ'=>'AE', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
                   'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I',
                   'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O',
                   'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U',
                   'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'à'=>'a', 'á'=>'a',
                   'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'ae',
                   'ç'=>'c', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e',
                   'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ñ'=>'n',
                   'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ö'=>'o',
                   'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ü'=>'u',
                   'ý'=>'y', 'ÿ'=>'y' }

        s.encode('ASCII',fallback: lambda { |c| fallback.key?(c) ? fallback[c] : undefined })
   end
但它只给了我以下字符串:

这是一个临时性的计划

甚至:

杰伊�T� 这是我的梦想�文图阿利特�临时工

我不明白为什么它不起作用

编辑:

我在用

file = File.open(i_FileName, 'r:utf-8')
为了阅读该文件,我将其替换为

file = File.open(i_FileName, 'r:iso-8859-1:utf-8')

它就像一个符咒

TL;DR:使用

引发意外结果的原因是
可能是1个符号(所谓的Unicode组合形式)以及2(两)个不同的符号(Unicode分解形式)

或者更简单地说:

"J'ai été mise au courant des éventualités à temps.".
  unicode_normalize(:nfd).gsub(/[\u0300-\u036F]/, '')
#⇒ "J'ai ete mise au courant des eventualites a temps."
我们在这里所做的是:我们将字符串规范化为分解形式(所有组合的变音符号都变成单独的符号),然后用


如果您对丢弃现有代码感到遗憾,请将字符串规范化为组合形式,并使用
编码
,现在就可以了

composed = "J'ai été mise au courant des éventualités à temps.".
   unicode_normalize(:nfc) # NOTE :nfc parameter

composed.encode(.....)

TL;DR:使用

引发意外结果的原因是
可能是1个符号(所谓的Unicode组合形式)以及2(两)个不同的符号(Unicode分解形式)

或者更简单地说:

"J'ai été mise au courant des éventualités à temps.".
  unicode_normalize(:nfd).gsub(/[\u0300-\u036F]/, '')
#⇒ "J'ai ete mise au courant des eventualites a temps."
我们在这里所做的是:我们将字符串规范化为分解形式(所有组合的变音符号都变成单独的符号),然后用


如果您对丢弃现有代码感到遗憾,请将字符串规范化为组合形式,并使用
编码
,现在就可以了

composed = "J'ai été mise au courant des éventualités à temps.".
   unicode_normalize(:nfc) # NOTE :nfc parameter

composed.encode(.....)

您有什么Ruby版本?我猜从数据库读取的字符串的编码与程序中的默认编码不同。对于调试,不要为缺少的键返回
未定义的
,而是返回
“[#{c.ord}]”
,并将其与
.ord
进行比较。为了减少痛苦,请使用
i18n
gem@mudasobwa我有2.4.2.198你有什么Ruby版本?我猜从数据库读取的字符串的编码与程序中的默认编码不同。对于调试,不要为缺少的键返回
未定义的
,而是返回
“[#{c.ord}]”
,并将其与
.ord
进行比较。为了减少痛苦,请使用
i18n
gem@mudasobwa我有2.4.2.198谢谢!当我使用之前定义的字符串时,它就起作用了。但当我从文本文件中获取字符串时,它不起作用,可能是我的Ruby脚本有问题。。无论如何,谢谢你,它肯定能与任何utf8编码的东西一起工作。如果您的文件是拉丁文,您可能希望以原始编码读取,然后将其转换为utf8,然后上述操作应该可以正常工作。我发现了错误,我使用file=file.open(I_FileName,'r:utf-8')来读取文件,我将其替换为file=file.open(I_FileName,'r:iso-8859-1:utf-8'),效果非常好!谢谢你!当我使用之前定义的字符串时,它就起作用了。但当我从文本文件中获取字符串时,它不起作用,可能是我的Ruby脚本有问题。。无论如何,谢谢你,它肯定能与任何utf8编码的东西一起工作。如果您的文件是拉丁文,您可能希望以原始编码读取,然后将其转换为utf8,然后上述操作应该可以正常工作。我发现了错误,我使用file=file.open(I_FileName,'r:utf-8')来读取文件,我将其替换为file=file.open(I_FileName,'r:iso-8859-1:utf-8'),效果非常好!谢谢