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文字とエスケープされていないUnicode文字を区別する方法を知っている人はいますか?

4

2 に答える 2

0

マイクのために実行可能な例を書きに行ったとき、私は自分の解決策を見つけました。文字列をプロパティ(言語、キー、メッセージ、エラーカウントなど)を持つオブジェクトにするために行った文字列の変更も、文字列をエスケープされていないユニコード形式に解釈したことがわかりました。

この小さな例は機能し、文字列を変更する前に「\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 に答える
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です。得られるのは の値を持つ int0だけです。ソース コードにゼロがいくつあったかを知る方法はありません。

于 2013-01-11T14:22:29.253 に答える