java编码方面的小问题

pistol_gao 发布于 2013/04/19 11:48
阅读 283
收藏 0
import java.net.URLDecoder;
class  URLTest
{
    public static void main(String[] args)
    {
        String str ="%u5317%u4EAC%u706B";
        String str3 ="\u5317\u4EAC\u706B";
        String str2 = str.replaceAll("%","\\\\");
        System.out.println(str3);
        System.out.println(str2);
        StringBuffer strbf = new StringBuffer();
        try{
            strbf.append(URLDecoder.decode(str2,"UTF-8"));
            System.out.println(strbf);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
为何输出是这样子的?str2 明明已经和str3相同了,为何直接打印结果不同。
北京火
\u5317\u4EAC\u706B
\u5317\u4EAC\u706B


加载中
0
答复哈
答复哈
明显是不一样的,str2应该是"\ \u5317\\u4EAC\\u706B"酱紫的~
pistol_gao
pistol_gao
没错没错,那怎么实现转码呢? String str2 = str.replaceAll("%","\\");这样子会报错的
0
悟方向
悟方向

在java中  \+u + 四个十六进制数字表示的是一个Unicode转义字符

就是说\uXXXX 这表示的是一个Unicode字符 而不是字符串"\\uXXXX" 所以你的程序中str3 这个变量的值应当是一个长度只有3的字符串("北京火") 你可以打一下str3的长度 :

System.out.println(str3.length());

pistol_gao
pistol_gao
回复 @享开发 : thanks,问题解决了。
悟方向
悟方向
回复 @pistol_gao : 这个网个有很多解决方案的 你可以google一下 java unicode 字符串 转字符
pistol_gao
pistol_gao
回复 @享开发 : 是的是的,求指教。
悟方向
悟方向
回复 @pistol_gao : 你的意思是想将字符串"\u706B"转换成这个unicode对应的字符 是吗?
pistol_gao
pistol_gao
sorry,简单点说就是,如何从str获取中文吧。
下一页
0
yongge
yongge
replaceAll()参数写反了
pistol_gao
pistol_gao
应该没吧~
0
pistol_gao
pistol_gao
public static void main(String[] args)
    {
        String str ="%u5317%u4EAC%u706B";
        String str3 ="\u5317\u4EAC\u706B";
        System.out.println(str3.length());
        //替换成\必须要用"\\\\"来表示一个\
        String str2 = str.replaceAll("%","\\\\");
        System.out.println(str3);
        System.out.println(str2);
        
        StringBuilder sb = new StringBuilder();
        sb.append(str2);
        System.out.println(ascii2Native(sb.toString()));
 
    }
    public static String ascii2Native(String str) {   
        StringBuilder sb = new StringBuilder();   
        int begin = 0;   
        int index = str.indexOf("\\u");   
        while (index != -1) {   
            sb.append(str.substring(begin, index));   
            sb.append(ascii2Char(str.substring(index, index + 6)));   
            begin = index + 6;   
            index = str.indexOf("\\u", begin);   
        }   
        sb.append(str.substring(begin));   
        return sb.toString();   
    }
    private static char ascii2Char(String str) {   
        if (str.length() != 6) {   
            throw new IllegalArgumentException(   
                    "Ascii string of a native character must be 6 character.");   
        }   
        if (!"\\u".equals(str.substring(0, 2))) {   
            throw new IllegalArgumentException(   
                    "Ascii string of a native character must start with \"\\u\".");   
        }   
        String tmp = str.substring(2, 4);   
        int code = Integer.parseInt(tmp, 16) << 8;   
        tmp = str.substring(4, 6);   
        code += Integer.parseInt(tmp, 16);   
        return (char) code;   

    } 

这样子,就解决了。

3
北京火
\u5317\u4EAC\u706B
北京火

谢谢各位的帮助。主要是区分str2 ,str3的不同,长知识了

返回顶部
顶部