인터페이스에서 사용하는 Oracle 필드는 고정 된 수의 바이트이고, 통과 된 문자열은 데이터베이스 필드의 총 바이트 수보다 더 큰 것으로 추정되기 때문에 데이터베이스의 바이트 수보다 작은 문자열이 가로 채 웁니다.
인터셉트 된 문자의 바이트 길이는 데이터베이스의 바이트 길이보다 작아야하기 때문에 인터넷의 예제를 참조하고 재귀적인 호출을 완료합니다.
/*** 통과 된 문자열이 지정된 바이트보다 큽니다. 지정된 바이트 숫자보다 작을 때까지 재귀 호출 *보다 큰 경우, 각 시스템의 문자 인코딩이 다르고 바이트의 수가 다르기 때문에 문자 인코딩을 지정하십시오 * @param s * @param num * @return 문자열 intercrected strow */ problodingexmention */ problodingexmention */ problodingexemention의 수를 지정하기 위해 통과합니다. num)은 예외를 던지고 {int changdu = s.getBytes ( "utf-8"). 길이; if (changdu> num) {s = s.substring (0, s.length () -1); s = idgui (s, num); } 반환 s; }Java 인터뷰 질문 :
줄, 입력을 문자열 및 바이트 및 바이트로 가로 채고 출력을 바이트에 의해 가로 채는 문자열로 가로 채는 함수를 작성하십시오. 그러나 한자가 절반을 차단하지 않도록해야합니다. 예를 들어, "I ABC"4는 "I AB"로 잘라야하고 "I ABC Chinese Def"를 입력하고 6은 "I ABC+ Chinese Half"대신 "I ABC"로 출력해야합니다.
현재 C# 및 Java와 같은 많은 인기있는 언어는 Unicode 16 (UCS2) 인코딩을 사용합니다. 이 인코딩에서 모든 문자는 두 문자입니다. 따라서 가로 채울 문자열이 중국어, 영어 및 숫자와 혼합되면 다음 문자열과 같은 문제가 발생합니다.
문자열 s = "a 플러스 B는 A 등이 C와 같고 B 등과 B와 같고 B 등 3";
위의 문자열에는 한자, 영어 문자 및 숫자가 모두 포함됩니다. 처음 6 바이트의 문자를 가로 채려면 "A 플러스 B 등"이어야하지만, 하위 문자열 메소드를 사용하여 처음 6자를 가로 채면 "A Plus B Ears C"가됩니다. 이 문제의 이유는 하위 문자열 메소드가 이중 바이트 중국어를 하나의 바이트 문자 (UCS2 문자)로 취급하기 때문입니다.
인코딩 형식의 영어 문자와 한자가 차지하는 바이트의 수도 다릅니다. 우리는 다음 예제를 사용하여 영어 문자의 바이트와 중국어가 몇 가지 일반적인 인코딩 형식으로 점유하는 수를 볼 수 있습니다.
java.io.unsupportedencodingException 가져 오기; public class encodetest { / ** * 지정된 인코딩 아래에서 문자열의 바이트 수와 인코딩 이름을 인쇄 * * @param s * string * @param encodingName * 인코딩 형식 * / public static void printBytelength (String S, String encodingName) {System.out.print ( "bytes :"); try {System.out.print (s.getBytes (encodingName) .length); } catch (UnsupportedEncodingException e) {e.printstacktrace (); } system.out.println ( "; 인코딩 :" + encodingName); } public static void main (String [] args) {String en = "a"; 문자열 ch = "사람"; // 다양한 인코딩 시스템에서 영어 문자의 바이트 수를 계산합니다. 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 (); // 다양한 인코딩 시스템에서 중국어의 바이트 수를 계산합니다. 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
바이트 수 : 2; 인코딩 : GB18030
바이트의 수 : 1; 인코딩 : ISO-8859-1
15. 바이트 수 : 3; 인코딩 : UTF-8
바이트의 수 : 4; 인코딩 : UTF-16
17. 바이트 수 : 2; 인코딩 : UTF-16BE
18. 바이트 수 : 2; 인코딩 : UTF-16LE
UTF-16BE 및 UTF-16LE는 유니 코드 인코딩 패밀리의 두 멤버입니다. 유니 코드 표준은 UTF-8, UTF-16 및 UTF-32의 세 가지 인코딩 형식을 정의하며 UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE 및 UTF-32LE의 7 가지 인코딩 체계가 있습니다. Java가 사용하는 인코딩 체계는 UTF-16BE입니다. 위의 예제의 실행 결과에서 GB2312, GBK 및 GB18030의 세 가지 인코딩 형식이 모두 질문의 요구 사항을 충족시킬 수 있음을 알 수 있습니다. GBK 인코딩을 예로 들어 대답 할 예정입니다.
문자열 클래스의 서브 스트링 (int beginindex, int endindex) 메소드를 문자별로 직접 사용할 수 없습니다. 'I'와 'Z'는 모두 하나의 캐릭터로 취급되고 길이는 모두 1입니다. 실제로, 우리가 한자와 영어 문자를 구별 할 수있는 한,이 문제는 쉽게 해결 될 것입니다. 차이점은 한자가 두 바이트이고 영어 문자는 1 바이트라는 것입니다.
package com.newyulong.iptv.billing.ftpupload; import java.io.unsupportedencodingException; public class cutstring { / *** 그것이 중국어인지 결정** @param c* char 정적 부울은 chinesechar (chaneechar)입니다 (char c)는 unsupportedencodingexception을 던졌습니다. {// 바이트의 수가 1보다 큰 경우, 그것은 중국어와는 달리 영어 문자를 중국어와 구별하는 데 그다지 엄격하지는 않지만이 질문에서는 문자열을 반환하기에 충분합니다. valueof (c). } / *** byte by byte* @param or null &&! "". //system.out.println(orignal.getBytes().length); // 가로 채울 바이트 수는 0보다 크고 원래 문자열의 바이트 수보다 작습니다. if (count> 0 && count <Orignal.getBytes ( "utf-8"). length) {StringBuffer buff = new StringBuffer (); 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")); 새 문자열을 반환합니다 (buff.tostring (). getBytes (), "utf-8"); }} 리턴 원본; } / *** byte by byte* @param or ! = NULL XENTER (ORIGNAL)) {// 원래 문자열을 GBK 인코딩 형식으로 변환 Orignal = new String (orignal.getBytes (), "gbk"); // 가로 채기 할 바이트 수는 0보다 크고 원래 문자열의 바이트 수보다 작습니다. if (count> 0 && count <Orignal.getBytes ( "gbk"). length) {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 (); }} 리턴 원본; } / *** 통과 된 문자열이 지정된 바이트보다 큰지 여부를 결정하십시오. 지정된 바이트* @param s* original string* @param num*보다 적을 때까지 재귀 호출보다 큰 경우* @return string intercepted string* / public static string idgui (string s, int num) {s.getbytes (stangdu) {int changdu (strangdu) {int changdu (strangdu) () if (changdu> num) {s = s.substring (0, s.length () -1); s = idgui (s, num); } 반환 s; } public static void main (string [] args)은 예외를 던집니다. {// Original String string s = "i zwr love you java"; System.out.println ( "원시 문자열 :" + s + ": 바이트 수는 :" + s.getBytes (). 길이); /* 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(" 처음 12 비트를 자르고 " + cutstring.substring (s, 12)); System.out.println ( "처음 12 바이트를 가로 채기 :" + cutstring.idgui (s, 11)); }}Java에 대한 위의 솔루션은 바이트 (권장)로 한자를 가진 문자열을 가로 채는 솔루션입니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.