Tomcat ソースコード起動コンソールの中国語文字化けのデバッグプロセス記録

Tomcat ソースコード起動コンソールの中国語文字化けのデバッグプロセス記録

問題を見つける

今日はTomcatのソースコードを勉強するつもりなので、公式サイトからTomcatのソースコードをダウンロードし、IDEAにインポートし、Mavenツールを使用してプロジェクトをビルドし、プロジェクトを開始したところ、コンソールにTomcatのログが出力されましたが、中国語の文字が文字化けしていました。

最初はIDEAの問題ではないかと疑い、オンラインでさまざまな解決策を試しました。大まかに以下のような種類があります。

1. 実行/デバッグ構成を変更し、VM オプション パラメータを追加します: -Dfile.encoding=utf-8;

2. 実行/デバッグ構成を変更し、環境変数パラメータを追加します: JAVA_TOOL_OPTIONS:-Dfile.encoding=utf-8 および JAVA_OPTS:-Dfile.encoding=utf-8;

3. IDEA 構成ファイルの 3 つのエンコーディングを UTF-8 に変更します。

4. IDEA のカスタム VM オプションを変更し、-Dfile.encoding=utf-8 を追加します。

5. IDEA インストールの bin ディレクトリにある idea.exe.vmoptions ファイルと idea64.exe.vmoptions ファイルを変更し、-Dfile.encoding=utf-8 を追加します。

6. プロジェクトの .idea フォルダーにある encodings.xml ファイルを変更し、UTF-8 ではなく UTF-8 に変更します。

7. tomcat のlogging.properties 構成ファイルを変更し、その中の UTF-8 を GBK に変更します。

8. 変更後、ターゲット フォルダーを削除して再コンパイルします。

9. 変更後、IDEA を再起動します。

すべての方法を試した後、図に示すように、文字化けしたコンソール ログの問題は解決されませんでした。

よく観察してみると、ログの左側にある「Information」や「Serious」などの中国語の文字化けは解消されましたが、ログにはまだ文字化けが残っています。

コードに問題があるのではないかと感じたので、ログの最初の行からコードをデバッグすることにしました。

2020年2月17日 10:10:08.585 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server.æœåŠ¡バージョン: Apache Tomcat/@VERSION@

org.apache.catalina.startup.VersionLoggerListener クラスの log() メソッドを見つけ、ブレークポイントを設定してステップごとに追跡します。

最終的に、PropertyResourceBundle クラスのルックアップ マップ コレクションにすべての値が存在し、コレクション内のデータが文字化けしていることが判明しました。

したがって、引き続きデバッガーを使用してルックアップの読み込みを表示し、ソース コードをチェックして、ルックアップ コレクション内のデータがプロパティ ファイルから読み取られていることを確認します。プロパティ ファイルのエンコーディングも UTF-8 であることを確認します。では、ソースコードの表示を続けます。

ResourceBundle の is = classLoader.getResourceAsStream(resourceName); によってロードされるプロパティ ファイル

次に、PropertyResourceBundle 構築メソッドを通じてデータを読み込みます。

このコードを変更しようとしたとき、これは JDK のクラスであり、変更できないことがわかりました。 (後で、ResourceBundle が国際化に使用されることを知りました)。

後で情報を確認したところ、Java では、ファイルの読み取りのデフォルト形式は iso8859-1 であり、中国語を保存する場合は通常 UTF-8 であることがわかりました。そのため、文字化けが発生します。

解決策は2つあります。

1. JDK の native2ascii.exe ツールを使用して、プロパティ ファイルを Unicode エンコーディングに変換します。変換後は以下のようになります。

2. コード内の値を取得したら、手動で再エンコードしてデコードします。

        試す {

            値 = 新しい文字列(value.getBytes("ISO-8859-1"), "UTF-8");

        }例外eをキャッチする{

            e.printStackTrace();

        }

テストの結果、どちらの方法でも問題を解決できることがわかりました。

Tomcat にはプロパティ ファイルが多すぎるため、2 番目の方法を採用し、Tomcat ソース コードを次のように変更しました。

1) org.apache.tomcat.util.res.StringManager クラスの getString(final String key, final Object... args) メソッド。

2) org.apache.jasper.compiler.Localizer クラスの getMessage(String errCode) メソッド

この時点で文字化けの問題は解決される

要約する

Tomcat ソースコード起動コンソールの中国語文字化けのデバッグプロセス記録に関するこの記事はこれで終わりです。Tomcat ソースコード起動コンソールの中国語文字化けに関する関連記事については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • IntelliJ IDEA 2021 Tomcat 8 起動時のコード文字化け問題の解決手順
  • Idea の起動速度を改善し、Tomcat ログの文字化けを解決する方法
  • JavaとIdeaがTomcatを起動したときに中国語が文字化けする問題を解決する
  • IDEA が Tomcat プロジェクトを開始するときに発生する文字化けした出力の解決方法
  • IDEA を起動したときに Tomcat コンソールで文字化けする問題を解決する
  • Tomcat 起動時に大量の文字化けが発生する問題を解決する方法

<<:  MySQLトリガーの使用

>>:  デザインリファレンス 美しく独創的なブログデザイン

推薦する

Vueのコンポーネントのprops属性について詳しく説明します

目次質問1: 小道具は具体的にどのように使用されますか?原理は何ですか?下を見る質問 2: 年齢に ...

MySQL における USING と HAVING の使用法の簡単な分析

この記事では、例を使用して MySQL での USING と HAVING の使用方法を説明します。...

Vue で eslint 検出をオフにする方法 (複数の方法)

目次1. 問題の説明2. 問題解決1. 問題の説明Vue プロジェクトを開発する場合、作成時に誤って...

アイデアを war パッケージにパッケージ化し、tomcat にデプロイしてアクセス パスの問題 (図とテキスト)

Web プロジェクトを war にパッケージ化するアイデアにとって最も重要なことは、アトリフィカを...

Windows 10 で MySQL 8.0.12 の解凍バージョンをインストールして構成する方法 (グラフィック チュートリアル付き)

この記事では、MySQL 8.0.12 の解凍版のインストールと設定方法を記録し、皆様と共有します。...

CentOS7にNginxを素早くインストールする方法を教えます

目次1. 概要2. Nginxインストールパッケージをダウンロードする3. 依存パッケージをインスト...

CentOS8 システムをベースにした Gitlab を構築するために Docker を使用する詳細なチュートリアル

目次1. Dockerをインストールする2. GitLabをインストールする3. GitLabを初期...

Centos 7 sshd の変更 | ルートログインの禁止と sshd ポートスクリプトの定義

1. 新しいユーザーwwweee000を作成します [root@localhost ~]# user...

事例を通してLinux NFSの仕組みを詳細に分析

前回の記事に引き続き、web02 サーバーを作成し、web01 サーバーと web02 サーバーの ...

HTMLのタグと要素の違いの詳細な説明

ウェブページに慣れていない友人の多くは私と同じように、HTML で要素、タグ、属性がどのように定義さ...

要素 UI に基づいてクエリ コンポーネントを段階的にカプセル化する方法

目次関数基本的なクエリ関数クエリ条件の初期化ページのレンダリングクエリと表示の最適化をさらに強化プル...

Linux システムで MySQL データベースの解凍バージョンをインストールして構成する方法

1. ファイルを現在のディレクトリに解凍しますコマンド: tar -zxvf mysql....ta...

要素テーブルの行と列のドラッグを実装する例

要素 ui テーブルにはドラッグ アンド ドロップによる並べ替え機能が組み込まれておらず、サードパー...

MySQL全文インデックスを使用して検索エンジンのサンプルコードの簡易版を実現する

序文全文インデックスを使用できるのは Innodb と MyISAM ストレージ エンジンのみです ...

MySQL 8.0 ディクショナリテーブル拡張の詳細な説明

MySQL のデータ ディクショナリは、データベースの重要なコンポーネントの 1 つです。INFOR...