0

我正在编写一个脚本来检查一些 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字符的方法吗?

4

2 回答 2

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,你得到的只是一个值为 的 int,0没有办法知道源代码中有多少个零。

于 2013-01-11T14:22:29.253 回答
0

当我去为 Mike 编写一个可运行的示例时,我找到了我的解决方案。事实证明,我在将字符串转换为具有属性(语言、键、消息、错误计数等)的对象时所做的字符串转换,也将字符串解释为其未转义的 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.
于 2013-01-11T16:43:22.073 回答