JNIはC ++中国の文字化けを呼び出すことについて

C JNIで実装ネイティブメソッドを呼び出すとき、我々は直接コンソールのコードページにゴミ問題を解決するために中国の方法を変更導入している(記事を参照します。http:?//Wiki.xuetang9.com/ P = 5254)が、C ++の実装にこのメソッドは、もう働か1日の午後を投げていない、最終的に問題を解決する方法を発見し、シェアは次のとおりです。

1、関連する概念

我々はすべて知っているように、Javaは、バイト2は英語で使用されている、文字列を表すために、内部16ビットのUnicodeエンコーディングを使用しています。内部JNIは、UTF-8文字列を使用してエンコードされ、実際には、UnicodeのUTF-8エンコーディングを表しています可変長のバージョン、一般的なASCII文字は1つのバイト、漢字は3バイト占め; C / C ++を使用して、元の(参照記事との対応:HTTP //wiki.xuetang9.com/のp = 5207?)データは、ASCII文字は、中国のGB2312は、一般的に漢字の2つのバイトを使用してエンコードされたバイトです。概念を定義して、操作が比較的明確です。これを説明するには、次の文字の流れの方向によると:

1-1:JavaからC / C ++へ

コールは、Java UTF-16エンコードされた文字列である場合この場合、JVM JNIこの文字列は、C / C ++はJSTRING取得した入力が、この時間は、JNIは2つの機能を使用して提供することが可能であり、 GetStringUTFCharsあり、この関数は、UTF-8でエンコードされた文字列を与える、他方はetStringChars UTF-16エンコードされた文字列を取得します。取得したが、中国が含まれている場合どちらの文字列関数、我々はさらにGB2312コードに変換する必要があります。次のように図です。

 

 

1-2:++ C / CからJavaへ

JavaへのJNIから文字列を返し、C / C ++、次いでNewStringUTF()またはNEWSTRING()JSTRING包装に文字列方法UTF-8やUTF-16フォーマットへの最初の文字列の原因である、となる、に返さJavaが使用できます

 

 

 

文字列は、単に標準のASCIIコードを中国語の文字が含まれていない場合この場合、UTF-8エンコーディングとASCIIエンコーディングは、変換と同じではありませんので、GetStringUTFChars()/ NewStringUTF()メソッドを使用して、処理することができます。中国の文字列が存在する場合でも、それはC / C ++プログラムでの操作をトランスコードする必要があります。ここで説明する:LinuxとWin32のサポートのwcharが、これは実際には16ビットのUnicodeエンコーディングUTF-16の幅です。私たちのC / C ++プログラムは完全にはwcharタイプを使用するのであれば、理論的には、あなたは、ハード、変換は必要ありません。しかし、実際には、書き込み処理中に誰もが完全にcharにwchar文字に置き換えることができないので、最新のアプリケーションの観点では、変換が依然として必要です。

2、翻訳方法:ヘッダファイルには含める必要があります。

 

 

 変換を行うためにワイドchar型を使用します。

 

 

 

 古い9つの学校:マイクロチャンネル公衆番号への注目ドライノートより

おすすめ

転載: www.cnblogs.com/ljxt/p/11612615.html