Ruby 2 中的 Translit 等效项(不带 iconv)

Ess*_*sse 5 ruby

正如我们所知,我们可以Iconv在 Ruby 1.9.3 中使用TRANSLITflag,它将用 ASCII 等效项替换重音字符,前提是它们不存在于目标编码中

\n\n

使用示例:

\n\n
require \'iconv\'\nz = "H\xc3\xa5kan"\nIconv.conv("windows-1250//TRANSLIT", "UTF-8", z) \n# => outputs "Hakan" (with diactric removed)\npl = "za\xc5\xbc\xc3\xb3\xc5\x82\xc4\x87"\nIconv.conv("windows-1250//TRANSLIT", "UTF-8", pl)\n# => outputs "za\xc5\xbc\xc3\xb3\xc5\x82\xc4\x87" (because windows-1250 contains all this characters)\n# well, to be honest it outputs "za\\xBF\\xF3\\xB3\\xE6" because of terminal settings\n# but I hope you understand\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是Iconv已被弃用,建议使用String#encode

\n\n

然而使用时#encode出现问题:

\n\n
z.encode(\'windows-1250\', \'utf-8\')\nEncoding::UndefinedConversionError: U+00E5 to WINDOWS-1250 in conversion from UTF-8 to WINDOWS-1250\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有办法获得与iconv TRANSLIT使用标志类似的行为String#encodeRuby 2+ 中

\n

ste*_*lag -1

如果您知道会发生什么,那么您可以在散列中指定替换:

\n\n
z = "H\xc3\xa5kan"\np z.encode(\'windows-1250\', \'utf-8\', fallback: {"\xc3\xa5"=>"a"}) # => Hakan\n
Run Code Online (Sandbox Code Playgroud)\n