インターフェイスで使用されるOracleフィールドは固定されたバイト数であり、渡された文字列はデータベースフィールドのバイトの総数よりも大きいと推定されるため、データベースのバイト数よりも小さい文字列がインターセプトされます。
インターネット上の例を参照して、再帰コールを完了します。インターセプトされた文字のバイト長はデータベースのバイト長よりも小さくなければならないためです。つまり、最後の文字が中国文字の場合、インターセプトを前方に削除することしかできません。
/***渡された文字列が指定されたバイトよりも大きいかどうかを判断します。指定されたバイト番号よりも小さいまで再帰的な呼び出し *よりも大きい場合は、各システムの文字エンコードが異なり、バイト数も異なるため、必ず文字エンコードを指定してください * @param num *が渡され、バイト数の数を指定します * @return intercections * @throws unsuppertededoding string * num)スロー例外{int changdu = s.getbytes( "utf-8")。長さ; if(changdu> num){s = s.substring(0、s.length()-1); s = idgui(s、num); } return s; }Javaインタビューの質問:
文字列、入力を文字列とバイトとしてインターセプトする関数、およびバイトによって傍受される文字列として出力を記述します。ただし、漢字が半分を切断しないようにする必要があります。たとえば、「I ABC」4は「I AB」として切り取られ、「I ABC中国のdef」を入力し、6は「I abc+ chinese half」の代わりに「i abc」として出力する必要があります。
現在、C#やJavaなどの多くの一般的な言語は、Unicode 16(UCS2)エンコードを使用しています。このエンコーディングでは、すべてのキャラクターが2つのキャラクターです。したがって、傍受する文字列が中国語、英語、および数字と混合されている場合、次の文字列などの問題が発生します。
string s = "aプラスBはcに等しく、a et a et。1とbが2に等しく、cなどは3"です。
上の文字列には、漢字、英語の文字、数字の両方が含まれています。最初の6バイトの文字をインターセプトする場合は、「プラスBなど」である必要がありますが、最初の6文字をインターセプトするためにサブストリング方法を使用すると、「プラスBに等しい」になります。この問題の理由は、サブストリング法が二重バイト漢字を1つのバイト文字(UCS2文字)として扱うからです。
異なるエンコード形式で英語の文字や漢字が占めるバイト数も異なります。次の例を使用して、いくつかの一般的なエンコード形式で英語の文字と漢字がいくつのバイトを占有しているかを確認できます。
java.io.unsupportedencodingexceptionをインポートします。パブリッククラスencodetest { / ** *コンソールへの指定されたエンコードの下にある文字列の名前とエンコード名を印刷 * * * @param s * string * @param encodingname * / public static void printbyteLength(string s、string encodingname){system.out.out(bytes:); try {system.out.print(s.getBytes(encodingName).length); } catch(unsupportedencodingexception e){e.printstacktrace(); } system.out.println( "; encoding:" + encodingName); } public static void main(string [] args){string en = "a";文字列ch = "people"; //さまざまなエンコーディングsystem.out.println( "英語文字:" + en)に基づく英語の文字のバイト数を計算します。 encodetest.printbytelength(en、 "gb2312"); encodetest.printbytelength(en、 "gbk"); encodetest.printbytelength(en、 "gb18030"); encodetest.printbytelength(en、 "iso-8859-1"); encodetest.printbytelength(en、 "utf-8"); encodetest.printbytelength(en、 "utf-16"); encodetest.printbytelength(en、 "utf-16be"); encodetest.printbytelength(en、 "utf-16le"); System.out.println(); //さまざまなエンコーディングSystem.out.println( "漢字:" + ch)の下で漢字のバイト数を計算します。 encodetest.printbytelength(ch、 "gb2312"); encodetest.printbytelength(ch、 "gbk"); encodetest.printbytelength(ch、 "gb18030"); encodetest.printbytelength(ch、 "iso-8859-1"); encodetest.printbytelength(ch、 "utf-8"); encodetest.printbytelength(ch、 "utf-16"); encodetest.printbytelength(ch、 "utf-16be"); encodetest.printbytelength(ch、 "utf-16le"); }}操作結果は次のとおりです。
1。英語の手紙:a
2。バイト数:1;エンコーディング:GB2312
3。バイト数:1;エンコーディング:GBK
4。バイト数:1;エンコード:GB18030
5。バイト数:1;エンコーディング:ISO-8859-1
6。バイト数:1;エンコーディング:UTF-8
7。バイト数:4;エンコーディング:UTF-16
8。バイト数:2;エンコード:UTF-16BE
9。バイト数:2;エンコード:UTF-16LE
10。漢字:人
11。バイト数:2;エンコーディング:GB2312
12。バイト数:2;エンコーディング:GBK
13。バイト数:2;エンコード:GB18030
14。バイト数:1;エンコーディング:ISO-8859-1
15。バイト数:3;エンコーディング:UTF-8
16。バイト数:4;エンコーディング:UTF-16
17。バイト数:2;エンコード:UTF-16BE
18。バイト数:2;エンコード:UTF-16LE
UTF-16BEとUTF-16LEは、ユニコードエンコードファミリーの2人のメンバーです。 Unicode標準では、UTF-8、UTF-16、およびUTF-32の3つのエンコード形式を定義し、UTF-8、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、およびUTF-32LEの7つのエンコードスキームがあります。 Javaが使用するエンコードスキームはUTF-16BEです。上記の例の実行結果から、GB2312、GBK、およびGB18030の3つのエンコード形式がすべて質問の要件を満たすことができることがわかります。回答の例としてGBKエンコードを取りましょう。
文字列クラスのサブストリング(int beginindex、int endindex)メソッドは、文字によって傍受されるため、直接使用することはできません。 「I」と「Z」はどちらも1つの文字として扱われ、両方の長さは1です。実際、漢字と英語の文字を区別できる限り、この問題は簡単に解決されます。違いは、漢字が2バイトで、英語の文字が1バイトであることです。
パッケージcom.newyulong.iptv.billing.ftpupload; import java.io.unsupportedencodingexcepting; public class cutstring { /***漢字であるかどうかを判断します** @returnは中国語文字であることを意味します。 java*/ public static booleanはChinesechar(Char c)Slows unsupportedencodingException {//中漢字の場合、それは漢字である場合、//この方法は漢字から英語の文字を区別するのにそれほど厳格ではありませんが、この質問では、この判断はstring.valueof(c)。 } / *** byteによる文字列をインターセプトします** @param original string* @param count* intercepted digits* @return intercepted string* @throws unsupportedencodingexception* javaはサポートしないエンコード形式* / public static string substring(string original、int count)をスローするunsupportedencodincepsection != null &&! ""。equals(orignal)){//元の文字列をgbkエンコード形式に変換しますorignal = new String(orignal.getBytes()、 "utf-8"); // // system.out.println(orignal); //system.out.println(orignal.getBytes( ).Length); //インターセプトされるバイト数は0より大きく、元の文字列のバイト数よりも少ないif(count> 0 && count <orignal.getBytes( "utf-8")。 Char C; for(int i = 0; i <count; i ++){system.out.println(count); c = original.charat(i); buff.append(c); if(cutstring.ischinesechar(c)){//漢字に遭遇した場合、バイトの総数を1倍に削減します。 }} // system.out.println(new String(buff.toString()。getBytes( "gbk")、 "utf-8")); new string(buff.tostring()。getBytes()、 "utf-8"); }}元のreturn; } / *** byteによる文字列をインターセプトします** @param original string* @param count* intercepted digits* @return intercepted string* @throws unsupportedencodingexception* javaがサポートしていないエンコード形式* / public static string gsubstring(string original、int count)supptortedencodingexceptionの場合は、 != null &&! ""。equals(orignal)){//元の文字列をgbkエンコード形式に変換しますorignal = new String(orignal.getBytes()、 "gbk"); //インターセプトされるバイト数は0より大きく、元の文字列のバイト数よりも少ないif(count> 0 && count <orignal.getBytes( "gbk")。長さ){stringbuffer buff = new stringbuffer(); Char C; for(int i = 0; i <count; i ++){c = orignal.charat(i); buff.append(c); if(cutstring.ischinesechar(c)){//漢字に遭遇した場合、バイトの総数を1つの - カウントに削減します。 }} return buff.toString(); }}元のreturn; } / ***通過した文字列が指定されたバイトよりも大きいかどうか、指定されたバイトよりも大きい場合* @param s* @param num* @return stringを指定するために渡されます。 if(changdu> num){s = s.substring(0、s.length()-1); s = idgui(s、num); } return s; } public static void main(string [] args)スロー例外{//元の文字列s = "i zwr love you java"; system.out.println( "raw string:" + s + ":バイト数は" + s.getbytes()。length); /* system.out.println( "最初の1桁をインターセプトします:" + cutstring.substring(s、1)); system.out.println( "最初の2桁をインターセプトします。" + cutstring.substring(s、2)); System.out.println( "最初の4ビットをインターセプトします:" + cutstring.substring(s、4)); *///system.out.println( "intercept the最初の12ビット:" + cutstring.substring(s、12)); System.out.println( "最初の12バイトをインターセプトします:" + cutstring.idgui(s、11)); }}Javaの上記の解決策は、バイト(推奨)で漢字を介して文字列を傍受することです(推奨)。私があなたと共有するすべてのコンテンツです。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。