to 李祖祥: 呵呵,十分感谢,可能是我的意思没有说明白,我说的意思是:如果现在有大量的这样的字符串存在于数据库中,而且可能在&#xxx之间夹杂的有英语字符,而现在我要把这样的字符串转化成正常显示的字符串,英文就显示成英文,&#显示成中文,然后更新数据库中原来的字段成为能正常显示的字符.希望你能帮我想出一个更好的方法.先谢谢了.
那我 String company = “江蘇舜天股份有限公司”; company = new String(company,"GBK"); System.out.println(company); 为什么还是输入unicode 呢? 这有什么问题吗?
27743才是江的Unicode. 而江是处理后产生的(猜测:你用的可能不是WINDOWS的操作系统吧。)company = new String(company,"GBK"); 要这样转换的话,company必须为一个byte[],而现在company为String. 就算是用company.getBytes(),返回的也是'&','#','2','7'等等对应的字节值 而无法把27743(0x6c5f)作为整体看待。
;³ 只需要把其中的 179 变为 byte 数据,再把这样的 byte[] 构造为一个 String
³ 0xB3
两个字节的汉字内码即:CDB3¼ 0xBC
Æ 0xC6
两个字节的汉字内码即:BCC6使用WINDOWS自带的内码--区位输入法,输入CDB3即为“统”,输入BCC6即为“计”。所以上面的每两个字节表示一个汉字。并且是汉字的内码。
179 (0xB3) 减去 160 (0xA0) 即得汉字所在位为19。输入4519为“统”,输入2838为“计”,这是区位码输入方式。
{
public static void main(String[] args) throws Exception
{
// 汉字内码
byte[] data = new byte[]
{
(byte)205, (byte)179, (byte)188, (byte)198, (byte)202, (byte)253,
(byte)190, (byte)221, (byte)180, (byte)243, (byte)178, (byte)187,
(byte)196, (byte)220, (byte)201, (byte)250, (byte)179, (byte)201,
(byte)190, (byte)178, (byte)204, (byte)172, (byte)177, (byte)168,
(byte)177, (byte)237, (byte)206, (byte)196, (byte)188, (byte)254
};
System.out.write(data);
System.out.println();
}
}控制台输出为:统计数据大不能生成静态报表文件
Press any key to continue...
呵呵,十分感谢,可能是我的意思没有说明白,我说的意思是:如果现在有大量的这样的字符串存在于数据库中,而且可能在&#xxx之间夹杂的有英语字符,而现在我要把这样的字符串转化成正常显示的字符串,英文就显示成英文,&#显示成中文,然后更新数据库中原来的字段成为能正常显示的字符.希望你能帮我想出一个更好的方法.先谢谢了.
请问和楼主的数据有什么区别?
import java.io.*;public class Convert
{
public static String toGB(String original) throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
Pattern pattern = Pattern.compile("&#\\d\\d\\d;"); //正则表达式匹配&#???;
Matcher matcher = pattern.matcher(original);
int lastEnd = 0; //上一次匹配的结束位置
while (matcher.find()) //找一下个匹配串
{
if (lastEnd != matcher.start()) //写正常英文字符
{
dos.write(original.substring(lastEnd, matcher.start()).getBytes());
}
String oneByte = matcher.group();
oneByte = oneByte.substring(2, 5); //取出&#???;中的???
int data = Integer.parseInt(oneByte);
dos.write(data);
lastEnd = matcher.end();
}
if (lastEnd < original.length()) //写剩下的正常英文字符
{
dos.write(original.substring(lastEnd).getBytes());
}
String converted = new String(baos.toByteArray());
dos.flush();
dos.close();
return converted;
}
public static void main(String[] args) throws IOException
{
String originalA = "RPC-E1ͳ¼ÆÊý"
+ "¾Ý´ó,²»ÄÜÉ"
+ "ú³É¾²Ì¬±¨"
+ "±íÎļþ";
String originalB = "RPC-E1ͳJava¼Æ&ÊýMS"
+ "¾Ý;´ó,²»#ÄÜPRCÉ"
+ "ú&#³É#&¾²;̬&*±¨"
+ "±íHello, WorldÎļþChina!";
String convertedA = Convert.toGB(originalA);
String convertedB = Convert.toGB(originalB);
System.out.println(convertedA);
System.out.println(convertedB);
}
}
输出为:
RPC-E1统计数据大,不能生成静态报表文件
RPC-E1统Java计&数MS据;大,不#能PRC生&#成#&静;态&*报表Hello, World文件China!
Press any key to continue...这两组测试数据都没有问题。希望对您能够有帮助!
但 “江蘇舜天股份有限公司”
和 RPC-E1ͳ¼ÆÊý¾Ý´ó,²»ÄÜÉú³É¾²Ì¬±¨±íÎļþ
编码应该是不一样的,请问楼上的怎么解决呢?谢谢
已在你开的那个贴中解决了。
是什么格式的编码?
是Unicode编码.
27743转换为16进制为0x6c5f用System.out.println('\u6c5f');
即输出“江”.
System.out.println((char)27743);
输出一样的。
company = new String(company,"GBK");
System.out.println(company);
为什么还是输入unicode 呢?
这有什么问题吗?
而江是处理后产生的(猜测:你用的可能不是WINDOWS的操作系统吧。)company = new String(company,"GBK");
要这样转换的话,company必须为一个byte[],而现在company为String.
就算是用company.getBytes(),返回的也是'&','#','2','7'等等对应的字节值
而无法把27743(0x6c5f)作为整体看待。
输出为80
即字符串中的一个英文字符对应一个字节了。
呵呵 以前还一直以为是编码环境的问题呢 真是谢谢你啦
ʯ¼ÒׯºÍ½ø³
;ÌÎÊÌ⣺
2004Äê7ÔÂ20ÈÕÍíÉÏÎÒ
;Ãǽ«21ºÅµÄ½ÚÄ¿Ê
;±¼ä±íÌí¼ÓÉÏ£¬
@12;ËÐкó£¬ÉÏÒ²
不明白为什么会产生个@字符,而且有的是以&#前,有的在后,有的在是中间,还有的是在数字中间.
问怎么去年不正常的换行符和奇怪的@字符,从面可以顺利转化呢?
http://community.csdn.net/Expert/topic/3472/3472337.xml?temp=.2961847
public static void main(String[] args) {
String src = "ͳ¼ÆÊý¾Ý´ó,²»ÄÜÉú³É¾²Ì¬±¨±íÎļþ";
System.out.println(new String(decode(src,null)));
}
public static byte[] decode(String source, String encoding) {
if (source == null) {
source = "";
}
StringBuffer buf = new StringBuffer();
StringBuffer tmp = null;
char c;
for (int j = 0; j < source.length(); j++) {
c = source.charAt(j);
if (tmp == null) {
if (c == '&') { // 找到了可能的转义字符开端
tmp = new StringBuffer();
}
else {
buf.append(c);
}
}
else {
if (c == ';') { // 转义字符的结束标志
if(tmp.charAt(0)=='#'){
buf.append((char)(Integer.parseInt(tmp.substring(1))));
}
else { // 不是转义
buf.append(tmp.toString()).append(';');
}
tmp = null;
}
else {
tmp.append(c); // 可能是转义字符的一部分
}
}
}
if (tmp != null) {
buf.append(tmp.toString());
tmp = null;
}
try {
return buf.toString().getBytes(encoding);
}
catch (UnsupportedEncodingException ex1) {
return buf.toString().getBytes();
}
}http://www.yi-dao.com