如何区分转义和未转义的Unicode字符?

时间:2013-01-11 04:06:55

标签: ruby unicode

我正在编写一个脚本来检查Java的一些已翻译的消息文件。我们的消息源不允许格式块中的未转义Unicode字符:

{0,number,¤UNESCAPED# ###}

1.9.2p290 :001 > unescaped = "{0,number,¤UNESCAPED# ###}"
 => "{0,number,¤UNESCAPED# ###}" 
1.9.2p290 :002 > escaped = "{0,number,\u00A4ESCAPED# ###}"
 => "{0,number,¤ESCAPED# ###}" 

请注意,转义和非转义显示方式相同:

1.9.2p290 :003 > escaped.inspect
 => "\"{0,number,¤ESCAPED# ###}\"" 

String.inspect方法应该显示转义的特殊字符:

1.9.2p290 :004 > escaped.dump
 => "\"{0,number,\\u{a4}ESCAPED# ###}\"" 
1.9.2p290 :005 > unescaped.dump
 => "\"{0,number,\\u{a4}UNESCAPED# ###}\"" 

dump应该做同样的事情。

任何人都知道区分转义和非转义Unicode字符的方法吗?

2 个答案:

答案 0 :(得分:0)

1.9.2p290 :001 > unescaped = "{0,number,¤ESCAPED# ###}"
 => "{0,number,¤UNESCAPED# ###}" 
1.9.2p290 :002 > escaped = "{0,number,\u00A4ESCAPED# ###}"
 => "{0,number,¤ESCAPED# ###}" 

在上面的例子中,它不仅以相同的方式显示它,但字符串完全相同。解析器在解析程序源代码时将unicode转义序列转换为相应的字符。

所以在上面的例子中,没有什么可以区分的。并且程序本身无法知道您是否使用转义序列或文字字母来编写字符串文字。它与编写像000这样的数字文字相同,你得到的只是一个值为0的int,没有办法知道源代码中有多少个零。

答案 1 :(得分:0)

当我为迈克写一个可运行的例子时,我发现了我的解决方案。事实证明,我做的字符串调整使字符串成为具有属性(语言,键,消息,错误计数等)的对象,也将字符串解释为其未转义的unicode格式。

这个小例子有效并帮助我弄清楚我需要在修改字符串之前检查'\ u'。

infile = File.new('demo-messages.properties', "r", encoding: Encoding::UTF_8)
while (line = infile.gets)
  if line.ascii_only?
    puts "line contains ascii only: #{line}"
  else
    puts "line contains non-ascii text: #{line}"
  end

  #the important part
  if line.inspect.include?('\u') #this check actually works
    puts "line has escaped unicode characters: #{line}"
  else
    puts "line has un-escaped unicode characters: #{line}"
  end
end
infile.close

# FILE: demo-mesages.properties
escaped=Cela vous coûte environ {0,number,\u00A4# ###} de plus.
with_utf8_char=Cela vous coûte environ {0,number,¤# ###} de plus.

输出:

$ ruby runnable_example.rb 
line contains non-ascii text: escaped=Cela vous coûte environ {0,number,\u00A4# ###} de plus.
line has escaped unicode characters: escaped=Cela vous coûte environ {0,number,\u00A4# ###} de plus.
line contains non-ascii text: with_utf8_char=Cela vous coûte environ {0,number,¤# ###} de plus.
line has un-escaped unicode characters: with_utf8_char=Cela vous coûte environ {0,number,¤# ###} de plus.