由于接口使用的oracle字段长度为固定字节数,然后传进来的字符串估计比数据库字段的总字节数要大,那么截取小于数据库字节数的字符串。
自己参考网上的例子,整了个递归调用就可以了,因为截取的字符字节长度必须小与数据库的字节长度,即如果最后一个字符为汉字,那么只能去掉往前截取。
/**
* 判断传进来的字符串,是否
* 大于指定的字节,如果大于递归调用
* 直到小于指定字节数 ,一定要指定字符编码,因为各个系统字符编码都不一样,字节数也不一样
* @param s
* 原始字符串
* @param num
* 传进来指定字节数
* @return String 截取后的字符串
* @throws UnsupportedEncodingException
*/
public static String idgui(String s,int num)throws Exception{
int changdu = s.getBytes(
"UTF-8"
).length;
if(changdu > num){
s = s.substring(0, s.length() - 1);
s = idgui(s,num);
}
return s;
}
http://blog.csdn.net/yangyan19870319/article/details/6144131
java面试题:
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个"。
目前很多流行的语言,如C#、Java内部采用的都是 Unicode 16(UCS2)编码,在这种编码中所有的字符都是两个字符,因此,如果要截取的字符串是中、英文、数字混合的,就会产生问题,如下面的字符串:
String s = "a加b等于c,如果a等1、b等于2,那么c等3";
上面的字符串既有汉字,又有英文字符和数字。如果要截取前6个字节的字符,应该是”a加b等",但如果用substring方法截取前6个字符就成了"a 加b等于c"。产生这个问题的原因是将substring方法将双字节的汉字当成一个字节的字符(UCS2字符)处理了。
英文字母和中文汉字在不同的编码格式下,所占用的字节数也是不同的,我们可以通过下面的例子来看看在一些常见的编码格式下,一个英文字母和一个中文汉字分别占用多少字节。
- importjava.io.UnsupportedEncodingException;
-
publicclassEncodeTest{
-
-
publicstaticvoidprintByteLength(Strings,StringencodingName){
-
System.out.print("字节数:");
-
try{
- System.out.print(s.getBytes(encodingName).length);
-
}catch(UnsupportedEncodingExceptione){
- e.printStackTrace();
- }
-
System.out.println(";编码:"+encodingName);
- }
-
publicstaticvoidmain(String[]args){
-
Stringen="A";
-
Stringch="人";
-
-
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");
- }
- }
运行结果如下:
- 英文字母:A
- 字节数:1;编码:GB2312
- 字节数:1;编码:GBK
- 字节数:1;编码:GB18030
- 字节数:1;编码:ISO-8859-1
- 字节数:1;编码:UTF-8
- 字节数:4;编码:UTF-16
- 字节数:2;编码:UTF-16BE
- 字节数:2;编码:UTF-16LE
- 中文汉字:人
- 字节数:2;编码:GB2312
- 字节数:2;编码:GBK
- 字节数:2;编码:GB18030
- 字节数:1;编码:ISO-8859-1
- 字节数:3;编码:UTF-8
- 字节数:4;编码:UTF-16
- 字节数:2;编码:UTF-16BE
- 字节数: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编码为例来进行解答。
我们不能直接使用String类的substring(int beginIndex, int endIndex)方法,因为它是按字符截取的。'我'和'Z'都被作为一个字符来看待,length都是1。实际上我们只要能区分开中文汉字和英文字母,这个问题就迎刃而解了,而它们的区别就是,中文汉字是两个字节,英文字母是一个字节。
package com.newyulong.iptv.billing.ftpupload;
import java.io.UnsupportedEncodingException;
public class CutString {
/**
* 判断是否是一个中文汉字
*
* @param c
* 字符
* @return true表示是中文汉字,false表示是英文字母
* @throws UnsupportedEncodingException
* 使用了JAVA不支持的编码格式
*/
public static boolean isChineseChar(char c)
throws UnsupportedEncodingException {
// 如果字节数大于1,是汉字
// 以这种方式区别英文字母和中文汉字并不是十分严谨,但在这个题目中,这样判断已经足够了
return String.valueOf(c).getBytes("UTF-8").length > 1;
}
/**
* 按字节截取字符串
*
* @param orignal
* 原始字符串
* @param count
* 截取位数
* @return 截取后的字符串
* @throws UnsupportedEncodingException
* 使用了JAVA不支持的编码格式
*/
public static String substring(String orignal, int count)
throws UnsupportedEncodingException {
// 原始字符不为null,也不是空字符串
if (orignal != 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();
char c;
for (int i = 0; i < count; i++) {
System.out.println(count);
c = orignal.charAt(i);
buff.append(c);
if (CutString.isChineseChar(c)) {
// 遇到中文汉字,截取字节总数减1
--count;
}
}
// System.out.println(new String(buff.toString().getBytes("GBK"),"UTF-8"));
return new String(buff.toString().getBytes(),"UTF-8");
}
}
return orignal;
}
/**
* 按字节截取字符串
*
* @param orignal
* 原始字符串
* @param count
* 截取位数
* @return 截取后的字符串
* @throws UnsupportedEncodingException
* 使用了JAVA不支持的编码格式
*/
public static String gsubstring(String orignal, int count)
throws UnsupportedEncodingException {
// 原始字符不为null,也不是空字符串
if (orignal != null && !"".equals(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
--count;
}
}
return buff.toString();
}
}
return orignal;
}
/**
* 判断传进来的字符串,是否
* 大于指定的字节,如果大于递归调用
* 直到小于指定字节数
* @param s
* 原始字符串
* @param num
* 传进来指定字节数
* @return String 截取后的字符串
*/
public static String idgui(String s,int num){
int changdu = s.getBytes().length;
if(changdu > num){
s = s.substring(0, s.length() - 1);
s = idgui(s,num);
}
return s;
}
public static void main(String[] args) throws Exception{
// 原始字符串
String s = "我ZWR爱你们JAVA";
System.out.println("原始字符串:" + 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("截取前12位:" + CutString.substring(s, 12));
System.out.println("截取前12字节:" + CutString.idgui(s, 11));
}
}
分享到:
相关推荐
在Java编程语言中,处理带有汉字的字符串时,由于汉字占据多个字节,按照字节进行截取可能会导致汉字被不完整地分割,从而产生乱码。为了解决这个问题,我们需要理解Unicode编码以及如何在Java中正确处理多字节字符...
本文将深入探讨如何正确地按字节截取带有汉字的字符串,以确保不出现半字符或者乱码的情况。 首先,我们需要了解的是,Java默认使用Unicode编码,它对每个字符都分配了一个唯一的16位编码,这意味着大多数汉字在...
### Java中截取带汉字的字符串 在Java编程语言中,处理包含中文字符的字符串时,经常遇到的一个问题是如何正确地截取这些字符串。如果直接按照字节(byte)来进行分割,很容易导致中文字符被截断一半,从而形成乱码。...
在C#编程中,有时我们需要根据字节长度来截取字符串,这可能是因为要处理不同编码格式的数据,或者为了适应特定的传输限制。本篇将详细介绍如何在C#中按照字节长度截取字符串,并结合正则表达式进行操作。 首先,...
JAVA按照字节截取字符串是Java编程语言中的一项重要技术,通过本文,我们将详细介绍如何使用Java语言按照字节截取字符串。 首先,我们需要了解什么是字节截取。在计算机科学中,字节是信息技术中使用的基本单位,...
### 字符串截取按字节:深入解析与实践 在计算机编程中,字符串处理是一项基本而关键的任务,尤其在处理非英文字符时,如何精确地按照字节进行字符串截取变得尤为重要。本文将深入探讨一种按字节截取字符串的方法,...
字符串是由字符组成的序列,而“字符串按照指定的字节数来截取”这个话题,就是指如何在字符串中提取固定字节数的部分。在不同的编程语言中,都有相应的函数或方法来实现这一功能。 在Python中,可以使用内置的`...
在ASP.NET C#开发环境中,处理字符串是一项常见且重要的任务,尤其是在需要对字符串进行精确控制的情况下,如按字节截取字符串。本文将详细介绍如何为C#中的`String`类添加一个扩展方法,该方法允许我们按照字节而非...
Java 字符串截取函数 ...本例中,我们实现了一个 Java 字符串截取函数,该函数可以截取指定字节的字符串,并保证汉字不被截半个。该函数使用 `substring` 方法来实现字符串截取,并且可以应用于各种字符串处理场景。
截取含有中英文的字符串,按字节进行截取,当出现汉字时不能截取半个汉字要把汉字补全。
在IT行业中,处理字符串是常见...总的来说,按字节长度截取带有HTML代码的字符串是一个需要细心处理的问题,需要考虑到编码、HTML结构和潜在的不完整标签。通过自定义函数或使用第三方库,我们可以有效地解决这个问题。
在Java中,字符串的截取可以使用substring方法,但是这种方法不能保证汉字不被截半个,因为它是按照字符的个数来截取的,而中文字符占用两个字节,英文字符占用一个字节。因此,需要使用特殊的方法来截取中英文混合...
总结来说,处理Delphi中的中文和英文混合字符串截取,关键在于理解Unicode字符串的特性,正确选择和使用字符串截取函数,并在必要时进行字节对齐和编码转换。通过这样的方式,我们可以确保在处理多语言文本时不会...
7. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉...
题目中提到“截取前5个字节, 字符串应该为‘java程’”,意味着我们需要理解,在UTF-8编码格式下,英文字符通常占用1个字节,而中文字符则占用3个字节。因此,实际上,从“java程序教程”中截取前5个字节,得到的...
一般截取字符串是按照字符截取的,现在这个代码是按照字节截取字符
java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java ...
总结来说,“按byte截取字符串”是一项实用的技术,涉及到字符串编码、字节数组操作以及对Java语言特性的深入理解。在实际开发中,掌握这项技能对于处理与字节流相关的任务至关重要,尤其是在处理网络数据传输、文件...
但对于包含中文字符(双字节)的字符串,简单地按字符数量截取会导致截取结果不符合预期的字节长度。因此,需要设计一种更复杂的算法来解决这个问题。 ### 二、解决方案概述 根据题目描述,本节将详细介绍一种适用...
- **考虑多字节编码**:适用于包含多字节字符(如中文)的字符串。 - **利用正则表达式**:适用于需要进行更复杂条件判断的截取需求。 在实际开发过程中,应根据具体需求选择合适的方法。如果处理的是国际化文本,...