由于接口使用的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;

}

java面试题:

编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节VuPWrJXSq截取的字符串。但是要保证汉字不被截半个,如"我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字符)处理了。

英文字母和中文汉字在不同的编码格式下,所占用的字节数也是不同的,我们可以通过下面的例子来看看在一些常见的编码格式下,一个英文字母和一个中文汉字分别占用多少字节。

import java.io.UnsupportedEncodingException;

public class EncodeTest {

/**

* 打印字符串在指定编码下的字www.cppcns.com节数和编码名称到控制台

*

* @param s

* 字符串

* @param encodingName

* 编码格式

*/

public static void printByteLength(String s, String encodingName) {

System.out.print("字节数:");

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";

String ch = "人";

// 计算一个英文字母在各种编码下的字节数

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

运行结果如下:

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是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 Striwww.cppcns.comng(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按字节截取带有汉字的字符串的解法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

本文标题: java按字节截取带有汉字的字符串的解法(推荐)

本文地址: http://www.cppcns.com/ruanjian/java/162686.html

java字节字符_java按字节截取带有汉字的字符串的解法(推荐)相关推荐

  1. java截取中文_java按字节截取带有汉字的字符串的解法(推荐)

    由于接口使用的oracle字段长度为固定字节数,然后传进来的字符串估计比数据库字段的总字节数要大,那么截取小于数据库字节数的字符串. 自己参考网上的例子,整了个递归调用就可以了,因为截取的字符字节长度 ...

  2. c#获取带有汉字的字符串长度

    c#获取带有汉字的字符串长度 不知道大家注意没,用c#下自带的str.Length方法获得字符串str长度的时候,返回的总是字符的个数,但是如果字符串中包含汉字的话,一个汉字是占两个字符长度的,获取的 ...

  3. java字节字符_java中字符和字节的区别

    byte(字节): byte即字节的意思,是java中的基本数据类型,用来申明字节型的变量,一个字节包含8个位,所以,byte类型的取值范围是-128到127. 通常在读取非文本文件时(如图片,声音, ...

  4. java jpg结构_Java Class 字节码文件结构分析----附带逐字节码分析图

    欢迎访问我的博客,同步更新: 枫山别院 今天给大家分享下Java Class字节码文件的结构解析.(文末附有详细大图) 代码 首先我们创建一个Java类,然后添加一些成员变量和方法,如下: publi ...

  5. java byte缓存_Java 之 字节缓冲流

    一.字节缓冲输出流 java.io.BufferedOutputStream extends OutputStream BufferedOutputStream:字节缓冲输出流. 继承自父类的共性成员 ...

  6. 带有汉字的字符串截断出现半个“汉字”的解决方法-C语言源码

    汉字字符的编码为双字节,对于汉字字符和单字节字符混排的情况,如果目标截取的字符串内只包含奇数个单字节字符,则会出现半个汉字字符的问题.如下所示: (1)天水市秦州区南郭路2号(工行七里墩分理处? -- ...

  7. java 4字节字符_java 替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案

    /** * 替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案

  8. java 按字节读入_Java按字节读取文件

    [题外话]今天学习了Object-c.通过看书发现,Object-c跟大多数面向对象的语言一样,是很有意思的语言.里面的语法跟Java还有C++,形式上有些差异.至于我为什么要学OC,这个是因为工作需 ...

  9. java 字节序列_java – 在字节数组中存储二进制序列?

    String val = "1111000011110001"; byte[] bval = new BigInteger(val, 2).toByteArray(); 还有其他选 ...

最新文章

  1. 零基础入门学习Python(10)-列表(2)
  2. lisp 线性标注自动避让_泰州支重轮双头车自动化生产线
  3. 开机流程简介--init 处理系统初始化流程 (/etc/rc.d/rc.sysinit)
  4. source code compiled install mongodb
  5. 数据仓库—数据仓库—Sybase IQ 介绍
  6. Java异常分类及处理
  7. 蓝蛇端口扫描器 v2.8.4.724
  8. Java中多线程访问冲突的解决方式
  9. 已root手机在DDMS下无法读取data目录的解决办法
  10. 30K iOS程序员的简述:如何快速进阶成为高级开发人员
  11. 用gcc3.4.5编译c++项目
  12. .netcore入门2:深入理解.NET Core的基元: deps.json, runtimeconfig.json, dll文件
  13. 昆明计算机学校录取分数,云南省昆明铁路机械学校2021年招生录取分数线
  14. RK3399 Android7.1显示屏开机时或休眠唤醒后概率性不显示
  15. 发展存储芯片产业 中国是认真的
  16. 永中科技的救命恩人是谁?
  17. 如何在GraphPad Prism 里创建条形图?
  18. 名帖110 董其昌 小楷《五经一论册》
  19. hadoop编程实战——日志分析
  20. 华为交换机SNMP读取LLDP邻居信息的特殊配置

热门文章

  1. valgrind 简介(内存检查工具)
  2. 百度地图显示服务器已满,百度地图APP启动次数居首 生活服务深得用户青睐
  3. 【零 zedboard】从SD卡中启动
  4. 微软oneDrive网站打不开
  5. 关于echarts 跟ie的兼容性问题
  6. win10下quartus ii 13.1原理图图标和元件名字体大小问题
  7. 【材料课堂】材料科学基础108个重要知识点!(建议收藏)
  8. Flat Panel X-ray Imaging[转载]
  9. 数字逻辑手写实验报告
  10. Big data: The next frontier for innovation, competition, and productivity