一、通过getBytes("")获取各编码格式下的字符长度
字符指一个字母或一个字或一个标点或一个符号,不一定几个字节,看情况定,编码格式不同,每个字符所占字节不同
类型 | GBK(字节) | UTF-8(字节) |
字母数字 | 1 | 1 |
汉字 | 2 | 3 |
全角标点 | 2 | 3 |
半角标点 | 1 | 1 |
1.String length();//字符的长度
如:
String str = "中文123" ;
int len = str.length;// len =5 ;
为字符长度,因为 其采用 Unicode 编码形式,存储的是 每个字符在 编码集合中的 编号(在内存中 每两个字节存储一个编号)
2.length ;//字节的长度
如:
bytes [] byte = str.getBytes();
int lent = byte.length; // 字节长度 ,
java代码:
String name = "人1z,。";// 汉字 数字 字母 半角 全角
try {
byte [] test = name.getBytes("GBK");
System.out.println(""+name.length()+" " +test.length); // 7 = 2 + 1 + 1 + 1 + 2
byte [] test1 = name.getBytes("UTF-8");
System.out.println(""+name.length()+" " +test1.length);// 9 = 3 + 1 + 1 + 1 + 3
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
数据表中对应的varchar char 类型 对应字符的长度 而不是字节的长度
String str = "汉";
byte[] bytes = str.getBytes("Unicode");
for(int index = 0 ; index < bytes.length ; index++){
System.out.println(bytes[index]);
}
System.out.println(bytes.length);
二、getBytes("Unicode") 相关工具类分析
Unicode 表示一个汉字用两个字节;
此处输出长度为4;
-2
-1
108
73
前两为为顺序表示;大头、小头;
http://blog.csdn.net/lcfeng1982/article/details/6830584
// 通过 length 即 字节长度截取指定长度的字符串,excepLength 为截取出现问题时的最低截取长度
public static String bSubstring(String s, int length, int excepLength) {
try {
s = s.replaceAll("\\s*", "");
byte[] bytes = s.getBytes("Unicode"); // Unicode 默认按照UnicodeLittleUnmarked 小头规则,一个字符两个字节表示,高位在第二个字节的位置
// 一个字符串总在第一个字符的编码前面加上编码顺序的标识
int n = 0; // 表示当前的字节数
int i = 2; // 要截取的字节数,从第3个字节开始
// 0 1 2 按照数组下标的顺序取值;前两位为顺序标识,即告知系统当前的编码顺序时小头;系统默认处理
// 英文数字编码:高位为0;汉字高低位都不为0
// 当前系统按照Unicode取编码结果,默认按照大头顺序,即高位在前
// 从第三个字节开始,即i=2处开始,所以else 上判断是否为0,为0表示当前为ASCII中的值
for (; i < bytes.length && n < length; i++) {
// 奇数位置,如3、5、7等,为UCS2编码中两个字节的第二个字节
// 从 2 开始,奇数位加一,偶数为不为0加一,length 指字节的长度,而不是字符的长度;
// i 是当前的数组下标
if (i % 2 == 1) {
n++; // 在UCS2第二个字节时n加1
} else {
// 当UCS2编码的第一个字节不等于0时,该UCS2字符为汉字,一个汉字算两个字节
if (bytes[i] != 0) {
n++;
}
}
}
// 如果i为奇数时,处理成偶数
if (i % 2 == 1) { // 为奇数即字符串中含有数字字母,偶数个,此处灵活配置,因为两个字符标识一个字符,只是强制判断当前是汉字且只有一位,舍弃
// 该UCS2字符是汉字时,去掉这个截一半的汉字
if (bytes[i - 1] != 0)
i = i - 1;
// 该UCS2字符是字母或数字,则保留该字符
else
i = i + 1;
}
return new String(bytes, 0, i, "Unicode");
} catch (Exception e) {
JrdLogManager.runLog(Level.ERROR, "bSubstring exception :" + e);
return s.replaceAll("\\s*", "").length() > excepLength ? s.replaceAll("\\s*", "").substring(0, excepLength) : s;
}
}
分享到:
相关推荐
字符串是由字符组成的序列,而“字符串按照指定的字节数来截取”这个话题,就是指如何在字符串中提取固定字节数的部分。在不同的编程语言中,都有相应的函数或方法来实现这一功能。 在Python中,可以使用内置的`...
字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流...
单字节字符通常指的是ASCII字符,而双字节字符则涉及到Unicode字符集,如汉字和其他非英文字符。下面将详细探讨如何计算字符串中的单双字节字符个数,以及它们在实际应用中的作用。 首先,让我们理解什么是单字节...
本篇文档提到的“textarea 控制输入字符字节数”的知识点,便是介绍如何通过JavaScript脚本来限制`<textarea>`输入框中输入内容的字节长度。文档中提供了具体的示例代码,通过这些代码,开发者能够限制用户在输入时...
在C#编程中,有时我们需要根据字节长度来截取字符串,这可能是因为要处理不同编码格式的数据,或者为了适应特定的传输限制。本篇将详细介绍如何在C#中按照字节长度截取字符串,并结合正则表达式进行操作。 首先,...
java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java ...
字符串变成字节
### 如何处理错误ORA-29275:部分多字节字符 #### 问题背景与描述 在Oracle数据库操作过程中,用户可能会遇到一个特定的错误提示——ORA-29275:部分多字节字符。这一错误通常出现在执行查询`SELECT * FROM V$...
在C#编程中,字节(byte)、字符(char)和字符串(string)是三种基本的数据类型,它们在处理文本和数据流时扮演着不同角色。理解它们之间的区别至关重要,尤其是在涉及网络传输、文件存储和编码转换等场景。 首先...
本书主要表现Unicode编码的平面数、编码方法、码位数、字符字节数、字符区域划分等重要概念 通过UTF32、UTF-16、UTF-8以及ANSI之间的对比表现字符字节数的变化规律。表现Windows操作系统个版本与Unicode之间的关系。...
在VB(Visual Basic)编程环境中,我们经常需要处理字符串数据,并且在某些情况下,了解字符串的字节总数是非常重要的。字节总数可以帮助我们计算存储需求、传输数据的大小或者进行编码转换等操作。本篇文章将深入...
在Java编程语言中,输入/输出(I/O)操作是处理数据流的关键部分,而字符流与字节流则是实现这些操作的两种基本方式。理解它们的区别和应用场景对于任何Java开发者来说都是至关重要的。 ### 字节流 字节流是最基本...
该程序在VS2008上测试通过,代码可以实现多字节和宽字节字符之间的相互转换。
除了将记录导出到word方法外(word要把“允许西文在单词中间换行"勾上),笔者写了一个自定义函数,可将字符按用户指定的字节长度参数分割成等长字符,调用时用test(字符串,字节长度)即可,比如字符为”CSDN是个...
字符串和字节的转换。字节数组转换为字符串,字符串转换成字节数组.
### C#中获取字符串的字节数方法及应用实例 #### 概述 在软件开发过程中,特别是涉及到国际化和多语言支持的应用程序中,经常需要处理不同编码下的字符串长度问题。例如,在某些应用场景下,我们需要限制用户输入...
### 字符串与字节数组之间的转换 在计算机编程领域,数据的转换是一项非常重要的工作,尤其是在处理网络通信、文件读写等场景时。本文将详细介绍如何在.NET框架下实现字符串与字节数组之间的转换,特别是字符串到16...
### Java字节与字符 #### 一、字节流与字符流的概念 在Java的I/O包中,根据处理的数据类型不同,可以将流分为两大类:字节流和字符流。 - **字节流**:处理的是8位的数据单元,即字节,主要适用于处理二进制文件...
根据给定文件的信息,我们可以总结出以下关于C#中十六进制与字符串、字节数组之间转换的相关知识点: ### C#中十六进制与字符串、字节数组之间的转换 #### 一、概述 在计算机编程中,经常需要进行不同数据格式...
在VB6.0编程环境中,字节数组和字符串之间的转换是常见的操作,尤其是在处理二进制数据和文本数据之间转换的场景。本教程将详细解释如何在VB6.0中进行这两种数据类型的转换,并通过实际示例进行演示。 1. 字符串转...