① java的编码不是UCS2么怎么像是多字节编码
java的char 是以UCS2编码来交换的,每个字符占2个字节。
但getBytes属于IO了,通常默认用UTF8编码。
在utf8下,'中国'各占3个字节,‘23’各占1个字节,合起来8个。
② Java:在Java中String是以Unicode保存的吗
字符串在java内存中总是按unicode编码存储的。比如"中文",正常情况下(即没有错误的时候)存储为"4e2d 6587",如果charset为"gbk",则被编码为"d6d0 cec4",然后返回字节"d6 d0 ce c4".如果charset为"utf8"则最后是"e4 b8 ad e6 96 87".如果是"iso8859-1",则由于无法编码,最后返回 "3f 3f"(两个问号)。
java虚拟机采用UCS2(通用字符集)标准保存字符,所有的字符在内存中都是2个字节,这样虚拟机处理字符串的截取、长度和判断都非常容易。其他语言如PHP、Python也是,在运行时采用固定长度存储字符。
相对应编译后的class,java规定采用UTF-8保存,因为大部分是英文字符,只有一个字节,可以大量节省存储空间。
③ java 设置字符集为UCS2 运行报错
系统没这样的字体,一般设置utf-8或gb2312或gbk即可
④ java认证:如何按字节长度截取字符串
编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。public static String substring(String str, int toCount,String more){int reInt = 0;String reStr = “”;if (str == null)return “”;char[] tempChar = str.toCharArray();for (int kk = 0; (kk 《 tempChar.length && toCount 》 reInt); kk++) {String s1 = str.valueOf(tempChar[kk]);byte[] b = s1.getBytes();reInt += b.length;reStr += tempChar[kk];}if (toCount == reInt || (toCount == reInt - 1))reStr += more;return reStr;}Web应用程序在浏览器中显示字符串时,由于显示长度的限制,常常需要将字符串截取后再进行显示。但目前很多流行的语言,如C#、Java内部采用的都是 Unicode 16(UCS2)编码,在这种编码中所有的字符都是两个字符,因此,如果要截取的字符串是中、英文、数字混合的,就会产生问题,如下面的字符串:String s = “a加b等于c,如果a等1、b等于2,那么c等3”;上面的字符串既有汉字,又有英文字符和数字。要解决这个问题的方法是首先得到该字符串的UCS2编码的字节数组,如下面的代码如下:byte[] bytes = s.getBytes(”Unicode“);由于上面生成的字节数组中前两个字节是标志位,bytes[0] = -2,bytes[1] = -1,因此,要从第三个字节开始扫描,对于一个英文或数字字符,UCS2编码的第二个字节是相应的ASCII,第一个字节是0,如a的UCS2编码是0 97,而汉字两个字节都不为0,因此,可以利于UCS2编码的这个规则来计算实际的字节数,
⑤ java中文字符输出问题
这个我网上一找就找到了,代码只把其中一个减号变成了加号。像你这种截5个6个都是同一个结果的话,就不能按照字符串截取了,要截取字节了 。代码如下,我用的是junit测试的,通过没问题。
public static String bSubstring(String s, int length) throws Exception {
byte[] bytes = s.getBytes("Unicode");
int n = 0; // 表示当前的字节数
int i = 2; // 要截取的字节数,从第3个字节开始
for (; i < bytes.length && n < length; i++) {
if (i % 2 == 1)// 奇数位置,如3、5、7等,为UCS2编码中两个字节的第二个字节
{
n++; // 在UCS2第二个字节时n加1
} else {
if (bytes[i] != 0)// 当UCS2编码的第一个字节不等于0时,该UCS2字符为汉字,一个汉字算两个字节
{
n++;
}
}
}
if (i % 2 == 1)// 如果i为奇数时,处理成偶数
{
if (bytes[i - 1] != 0)// 该UCS2字符是汉字时,修复这个截一半的汉字
i = i + 1;
else
// 该UCS2字符是字母或数字,则保留该字符
i = i + 1;
}
return new String(bytes, 0, i, "Unicode");
}
@Test
public void testGetByte() throws Exception {
String s = "abcd我们回答";
System.out.println(bSubstring(s, 6));
}
、//不好意思,把我所有的测试代码都发过来了,我只发你需要的这一个方法吧。
⑥ Java 中,数字,汉字,英文字母,...占多少字节
半角的数字和英文字母以及标点符号占用1字节,全角数字,英文字母和汉字占用2字节
⑦ ucs2到gbk转码
汉字不同编码转换的问题 UCS2转码的心得
看到很多朋友都对汉字的unicode编码有问题, 还需要什么”unicode汉字对应表”...
一直想回贴子,但太忙(包括忙着从论坛中索取自己需要的东西).
其实汉字的编码转换很简单,我相信C++也应该有相应的函数.希望这些代码对用Java的朋友有帮助.
/*
* UnicodeTest.java
*
* Created on July 29, 2003, 12:59 PM
*/
/**
*
* @author abc
* @version
*/
public class UnicodeTest
{
public static void main(String args[])
{
UnicodeTest UT = new UnicodeTest();
UT.test1();
}
public void test1()
{
String str = "测试信息abc123";
try
{
byte[] b = str.getBytes("GBK");
System.out.println(str + " -(GBK)编码: " + bytesToHexStr(b));
System.out.println("");
str = new String(b, "GBK");
System.out.println("从GBK编码 " + bytesToHexStr(b) + " 重新转换为字串: " + str);
System.out.println("");
b = str.getBytes("UnicodeBigUnmarked");
System.out.println(str + " -(UCS2)编码: " + bytesToHexStr(b));
System.out.println("");
str = new String(b, "UnicodeBigUnmarked");
System.out.println("从(UCS2)编码 " + bytesToHexStr(b) + " 重新转换为字串: " + str);
System.out.println("");
b = str.getBytes("ASCII");
System.out.println(str + " -(ASCII)编码: " + bytesToHexStr(b));
System.out.println("");
}
catch(Exception e){}
}
private String bytesToHexStr(byte[] b)
{
if (b == null) return "";
StringBuffer strBuffer = new StringBuffer(b.length * 3);
for(int i = 0; i < b.length; i++)
{
strBuffer.append(Integer.toHexString(b & 0xff));
strBuffer.append(" ");
}
return strBuffer.toString();
}
}
运行此小程序的输出结果是:
测试信息abc123 -(GBK)编码: b2 e2 ca d4 d0 c5 cf a2 61 62 63 31 32 33
从GBK编码 b2 e2 ca d4 d0 c5 cf a2 61 62 63 31 32 33 重新转换为字串: 测试信息abc123
测试信息abc123 -(UCS2)编码: 6d 4b 8b d5 4f e1 60 6f 0 61 0 62 0 63 0 31 0 32 0 33
从(UCS2)编码 6d 4b 8b d5 4f e1 60 6f 0 61 0 62 0 63 0 31 0 32 0 33 重新转换为字串: 测试信息abc123
测试信息abc123 -(ASCII)编码: 3f 3f 3f 3f 61 62 63 31 32 33
这段时间都在做联通的SP网关程序,原来我是做web应用的,对数据库之类的java编程比较熟悉。原来也从来没有接触过短信网关方面的系统设计和编程。在这个过程中碰到了几个比较棘手的问题,UCS2的转码就是其中一个。
刚开始我们公司的业务没有涉及到中文信息,所以没有注意这个问题,用户只需要发送字母和数字就可以了,但是最近几天我在数据库中发现了一些乱码,Messagecoding=8,我猜测可能和用户手机的输入法有关系,即使是阿拉伯数字也有双字节的,比如“8”和“8”。
下面这段代码是底层的API:
.........(read bytes from input)
//获取消息编码
MessageCoding = bodybytes[44];
//获取短消息内容的长度
SGIP_Command.BytesCopy(bodybytes, abyte0, 45, 48, 0);
MessageLength = SGIP_Command.Bytes4ToInt(abyte0);
//创建一个内容长度的Byte
MessageByte = new byte[MessageLength];
//将Message 到 MessageByte 中
SGIP_Command.BytesCopy(bodybytes, MessageByte, 49, (49 + MessageLength) - 1,0);
//开始解码转换
if(MessageCoding==8){//如果编码格式为UCS2,就转换成普通的String
try {
MessageContent = new String(MessageByte,"UnicodeBigUnmarked");
} catch (UnsupportedEncodingException e) {
}
}else{
MessageContent = new String(MessageByte);
}
实际上在java中就只需要一句MessageContent = new String(MessageByte,"UnicodeBigUnmarked");就可以转换过来,再保存到数据库中就不会是乱码了。
进行转换后,我还用了另外一个函数把类似“8”这样的GBK编码的阿拉伯数字都转换成了ASCII的数字。这样对业务逻辑有帮助。
还有一点要说明一下,GB2312是一个比较早版本的中文编码格式,GBK是新的中文编码格式,GBK是GB2312的超集,GB2312是GBK的真子集。
我的底层API是使用的英斯克的底层api,不过我修改了英斯克的API几个不完善的地方。希望对碰到和我一样问题的同志有点帮助。
⑧ java 用readline()读取带有汉字的文本文档,怎样才能做到不乱码
这个要根据文档的编码来处理,可以用read(bytes); new String(bytes, "gbk"); // 或其它编码ucs2,utf8之类的。
⑨ java,如果 i 奇数改成偶数看不懂,求详细解释.
String
x
=
"a";
String
y
=
"加";
String
z
=
"a加";
x.getBytes("Unicode");//[-2,
-1,
0,
97]
y.getBytes("Unicode");//[-2,
-1,
82,
-96]
z.getBytes("Unicode");//[-2,
-1,
0,
97,
82,
-96]
-2,-1是起始,从第三位开始是双字节字符(每2位代表一个中文或者英文);
⑩ java做 pdf转换成图片 时出现Unknown CMap: UniGB-UCS2-H急~
用jasperreport的exportpdffile那个方法生成pdf到指定的磁盘目录下,所有的pdf文件生成是生成了,文件大小也不一.但是打开任何pdf文件都是空白的,不知道为什么,而我换exporthtmlfile的那个方法生成的html文件都能展现正常.由于这个程序是在后台生成文件给mail发送的所以不通过jsp,action的流程,只能在后台指定目录中生成一个pdf文件,然后用mail去调用的.所以不能用response流生成pdf文件.都是通过传来的数据生成的pdf,我其他什么都没有改动,就只是用exportpdffile生成的pdf文件是空白的,但用exporthtmlfile的方法生成的能展现,说明数据源是没问题的.不知道为什么,困绕很久,由于需求只要求传pdf文件,所以不能用html的文件来传送,不知道是不是这两个方法的参数设置有什么不同吗?而且pdf的那两个itext中文包我也导入了,所以不存在字符转换问题