Поскольку поле Oracle, используемое интерфейсом, представляет собой фиксированное количество байтов, а строка, передаваемая, оценивается как больше, чем общее количество байтов в поле базы данных, то строка, меньшая, чем количество байтов в базе данных, перехватывается.
Я ссылаюсь на примеры в Интернете и просто завершаю рекурсивный вызов, потому что байт -длина перехваченного символа должна быть меньше, чем длина байта базы данных, то есть, если последний символ является китайским символом, то вы можете только удалить перехват вперед.
/*** Определите, является ли строка, проходящая в указанном уровне, чем указанный байт. Если он больше, чем рекурсивный вызов * до тех пор, пока он не станет меньше указанного номера байта, обязательно укажите кодирование символов, потому что кодирование символов каждой системы отличается, а количество байтов также различено * @param s * оригинальная строка * @param num * Прохождение, чтобы указать количество Bytes * @return String Spring * @throws unsupportedencecepcepecepecepecepecepectexpect num) бросает исключение {int Changdu = s.getbytes ("utf-8"). Length; 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» вместо «i abc+ китайская половина».
В настоящее время многие популярные языки, такие как C# и Java, используют кодирование Unicode 16 (UCS2). В этом кодировании все персонажи - два персонажа. Следовательно, если перехватывается строка, смешана с китайским, английским и цифром, возникают проблемы, такие как следующая строка:
Строка s = "a plus b равно C, если A и т. Д. 1 и B равны 2, то C и т. Д. 3";
Строка выше содержит как китайские иероглифы, английские символы и цифры. Если вы хотите перехватить символы первых 6 байтов, это должно быть «плюс B и т. Д.», Но если вы используете метод подстроения для перехвата первых 6 символов, это станет «плюс B равно C». Причина этой проблемы заключается в том, что метод подстроения рассматривает двойные китайские иероглифы как одного байтового символа (символы UCS2).
Количество байтов, занятых английскими буквами и китайскими иероглифами в разных форматах кодирования, также различено. Мы можем использовать следующие примеры, чтобы увидеть, сколько байтов английская буква и китайский символ занимают в некоторых общих форматах кодирования.
импортировать java.io.unsupportedencodingexception; открытый класс encodeTest { / ** * Распечатайте количество байтов и кодирования имени строки под указанным кодированием в консоли * * @param S * string * @param encodingname * encoding format * / public void printbytelength (String s, String encodingName) {System.out.print ("bytes:"); try {System.out.print (S.GetBytes (EncodingName) .length); } catch (unsupportEncodingexception e) {e.printstacktrace (); } System.out.println ("; кодирование:" + encodingName); } public static void main (string [] args) {string en = "a"; String ch = "people"; // Рассчитайте количество байтов английского письма в рамках различных кодирующих систем. 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 (); // Рассчитайте количество байтов китайского символа в рамках различных кодирующих систем. 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. Английские буквы:
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 являются двумя членами семейства кодирования Unicode. Стандарт Unicode определяет три формата кодирования: UTF-8, UTF-16 и UTF-32, и имеет семь схем кодирования: UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE и UTF-32LE. Схема кодирования, используемая Java,-UTF-16BE. Из приведенных результатов приведенного выше примера мы видим, что три формата кодирования GB2312, GBK и GB18030 могут соответствовать требованиям вопроса. Давайте возьмем кодирование GBK в качестве примера для ответа.
Мы не можем напрямую использовать метод подстроения (int beginindex, int endidex) класса строки, потому что он перехвачен символом. Оба «я» и «Z» рассматриваются как один персонаж, и обе длина равна 1. Разница в том, что китайские иероглифы - это два байта, а английские буквы - один байт.
пакет com.newyulong.iptv.billing.ftpupload; import java.io.unsupportedEncodingexception; открытый класс Cutstring { / *** определить, является ли это китайским символом** @param c* @return true Static Boolean-это Chinesechar (char c) бросает UnsupportedEncodingException {// Если количество байтов больше 1, это китайский символ // таким образом не очень строго в отличие английских букв от китайских иероглиф. } / ******* ! = 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"). Length) {StringBuffer buff = new StringBuffer (); Чар C; for (int i = 0; i <count; i ++) {System.out.println (count); c = Original.Charat (i); Buff.append (c); if (cutstring.ischinesechar (c)) {// При встрече с китайскими именами сократите общее количество байт байтов на 1 -count; }} // system.out.println (new String (buff.tostring (). Getbytes ("gbk"), "utf-8")); вернуть новую строку (buff.tostring (). getbytes (), "utf-8"); }} вернуть оригинал; } / *** string string by byte** @param оригинальная строка* @param count* intercept digits* @retun ! = null &&! "". equals (orignal)) {// конвертировать исходную строку в формат кодирования GBK orignal = new String (orignal.getbytes (), "gbk"); // количество перехватываемых байтов больше 0 и меньше количества байтов исходной строки if (count> 0 && count <orignal.getbytes ("gbk"). Length) {StringBuffer buff = new StringBuffer (); Чар C; for (int i = 0; i <count; i ++) {c = orignal.charat (i); Buff.append (c); if (cutstring.ischinesechar (c)) {// При встрече с китайскими именами нарежьте общее количество байтов на 1 -count; }} return buff.toString (); }} вернуть оригинал; } / *** Определите, превышает ли передача строка, чем указанные байты, если она больше, чем рекурсивный вызов* до тех пор, пока она не станет меньше, чем указанные байты* @param s* Оригинальная строка* @param num*, проходя, чтобы указать количество байтов* @return String. Строка* / public String String Idgui (String s, int num) {int unglemte = s.gettes;). if (changdu> num) {s = s.substring (0, s.length () - 1); s = idgui (s, num); } return s; } public static void main (string [] args) бросает исключение {// оригинальная строка String 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 первые 12 бит: " + cutstring.substring (s, 12)); System.out.println ("перехватить первые 12 байтов:" + cutstring.idgui (s, 11)); }}Вышеуказанное решение для перехвата Java Strings с китайскими иерогликами байтами (рекомендуется) - это все контент, которым я делюсь с вами. Я надеюсь, что это может дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.