Javaでbyte[]をStringに変換すると文字化けが発生する
まず、一般的に使用される byte[] を String に直接変換するのは非常に簡単です:
public static void main(String[] args) { String str="我是中国人"; byte[] arr=str.getBytes(); System.out.println("打印:"+arr); for(byte e : arr) { System.out.print(e + " "); } String str2=new String(arr); System.out.println("\n打印2:"+str2); }
Java 関連のビデオの推奨事項: Java learning
たとえば、上記の出力結果は次のとおりです。
打印:[B@15db9742 -50 -46 -54 -57 -42 -48 -71 -6 -56 -53 打印2:我是中国人
これを見ると、エンコーディングがわかります。 byte は 1 バイト、漢字は 2 バイトです。したがって、5 つの漢字には 10 バイト タイプのデジタル ストレージが必要です。次に、数字が漢字に変換され、標準化のプロセスが行われます。
では、Java は文字エンコーディングをどのように処理するのでしょうか?
JAVA は独自の String クラスを使用するため、String クラス オブジェクトはコーディング テーブルを指定する必要がありません。なぜ、一連の数字がそれぞれどの文字を表しているのかを知ることができるのでしょうか?これは、String 内の文字情報が UNICODE エンコードで格納されているためです。文字(単一の文字であることに注意してください)を表現するために、JAVA には char データ型もあり、そのサイズは 8 桁の 16 進数 2 桁の固定長で、0 ~ 65535 です。その目的は、UNICODE の文字に対応させることです。
文字列内の UNICODE 番号を取得したい場合は、getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
メソッドを使用して char[] を取得できます。 、この char[] は、UNICODE エンコード テーブルに従ってエンコードされた String 文字、数値を表します。
byte[ ] を String に変換するとコードが文字化けするのはなぜですか?
明らかに、上で述べたように、コーディング標準は異なります。たとえば、GB2312 標準における中国語の単語「dang」は、2 つの 8 桁の数字 0xB5 と 0xB1 で表されます。英語のシステムには GB2312 エンコーディング テーブルがないため、0xB5、0xB1 を与えると ASCII として扱われます。 Javaに入れると独自のUNICODE仕様に従って処理するため、仕様が異なると文字化けというおかしな結果が出てしまいます。
では、byte[] を String に変換する際の文字化けの問題を解決するにはどうすればよいでしょうか?
byte[] がどこから来たかによって異なります。他の場所に送信するためにピクチャを byte[] に変換し、次に String ストリーム オブジェクトに変換する必要があることがよくありますが、受信側はそれを byte[] に変換してからピクチャに変換します。
1. byte[] を直接送信する場合、byte[] が長すぎるとデータ損失が発生します。すべてのバイトの組み合わせを char にマッピングできるわけではないためです。
2. 共通の Base64 エンコーディング仕様を使用します。 Base64 のエンコード仕様は、一般的な文字を 6 ビットのバイナリ表現に変換することです (64 が一般的に使用されるため、base64 と呼ばれます)。書き方としては、以下のような既製のツールクラスがあります。
import org.apache.commons.codec.binary.Base64; public class UtilHelper { //base64字符串转byte[] public static byte[] base64String2ByteFun(String base64Str){ return Base64.decodeBase64(base64Str); } //byte[]转base64 public static String byte2Base64StringFun(byte[] b){ return Base64.encodeBase64String(b); } }
これにより、byte[] と String 間の標準的な変換が保証されます。
その他の関連記事とチュートリアルをお勧めします: Java ゼロベース入門
以上がJavaでbyte[]をStringに変換すると文字化けが発生するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。
