English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Javaでは、以下のように定義できます:
char c = '\u4f60'; char m = '\u0045'; char e = '\u554a';
このようなリテラル、例えば:
System.out.println("\u535a\u5ba2\u56ed");
このようなコードはどんなエンコーディング環境でも文字化けの問題が発生しません
しかし、このようなリテラルを定義することはできません:
char c = '\u000a'; char m = '\u0027';
これは\u000aと\u0027これは特殊なエスケープシーケンスであり、Javaは文字列リテラル中のUnicodeエスケープシーケンスに対して特別な処理を提供していません。プログラムはそのまま原文字に変換して、それが表す文字に変換されます[JLS]。 3.2]。
\u000aはLineFeedであり、つまり改行です。このため、プログラムは以下のようにコンパイルされます。
char c = ' ';
これはもちろんコンパイルエラーです。
別の例としては:
System.out.println("a\u0022.length()+\u0022b".length());
このプログラムに対する非常に浅い分析では、以下のように出力されるべきだと思われます。26、実際に実行してみると、結果が以下のいずれでもないことが判明しました。16、もしくは26ではなく、16、2.
なぜなら、\u0022これはダブルクォートのエスケープシーケンスであり、プログラムは最終的に以下のようにコンパイルされます。
String str = "a".length()+"b"; System.out.println(str.length());
このケースに基づいて、私は例を書きました。皆さんは実行してみてください。
String str = "\u0061\u0022\u002b\u0028\u006e\u0065\u0077\u0020\u006a\u0061\u0076\u0061\u002e\u0075\u0074\u0069\u006c\u002e\u0063\u006f\u006e\u0063\u0075\u0072\u0072\u0065\u006e\u0074\u002e\u0043\u0061\u006c\u006c\u0061\u0062\u006c\u0065<\u0056\u006f\u0069\u0064>\u0028\u0029\u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0056\u006f\u0069\u0064\u0020\u0063\u0061\u006c\u006c\u0028\u0029\u007b\u0074\u0068\u0072\u006f\u0077\u0020\u006e\u0065\u0077\u0020\u0052\u0075\u006e\u0074\u0069\u006d\u0065\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0028\u0022\u0073\u0075\u0070\u0072\u0069\u0073\u0065\u0020\u006d\u0061\u0074\u0068\u0065\u0072\u0020\u0066\u0075\u0063\u006b\u0065\u0072\u0021\u0022\u0029\u003b\u007d\u007d\u0029\u002e\u0063\u0061\u006c\u006c\u0028\u0029\u002b\u0022"; System.out.println(str);
これで本文の全てです。本文の内容が皆様の学習や仕事に少しでも役立つことを願っています。また、呐喊ガイドのサポートもお願いします!
声明:本文の内容はインターネットから取得しており、著作権者はすべて所有しています。インターネットユーザーによって自発的に提供され、自己でアップロードされた内容であり、本サイトは所有権を有しておらず、編集も行われていません。著作権侵害を疑う内容がある場合は、メールを notice#w までお送りください。3codebox.com(メールを送信する際には、#を@に置き換えてください。通報を行い、関連する証拠を提供してください。一旦確認がとれましたら、本サイトは直ちに侵害する可能性のあるコンテンツを削除します。)