精华内容
下载资源
问答
  • Java中的字符串转码处理

    万次阅读 2008-11-12 06:19:00
    又是字符串,看似简单的问题,却总是出错,以前是C,然后是VB,进而是COM提供的BSTR,似乎每门语言在字符串的处理上都有各自之道,这不,到了Java字符串我带来麻烦。 碰到的问题: 服务端通过Web获取用户...

        又是字符串,看似简单的问题,却总是出错,以前是C,然后是VB,进而是COM提供的BSTR,似乎每门语言在
    字符串的处理上都有各自之道,这不,到了Java,字符串又给我带来麻烦。
        碰到的问题:
            服务端通过Web获取用户选择的账套名称,为了使用第三方的JCR实现库,必须将账套名称作为参数写
    到相关的xml中,第三方库会从xml中读取该参数,进一步生成connection使用。在中文操作系统的服务器上运行
    正常,但是在英文操作系统下,如果传入的账套名为中文,则在xml中的账套名的中文部分被存为??。
        问题解决过程:
        第一步:
            :添加log,我想看一下从web端获取的账套名称。
            :通过日志文件,发现在日志文中取得的账套名的中文部分同样变为了??。
        判断:难道是web页面中取得账套名已经错了?不可能,因为系统其它地方大量用到该账套名,不可能有问题。
            或许是在写入时,转码出错。
        第二步: 
            :修改log,改成 账套名.getBytes(),然后将byte逐个转为16进制显示的字串。
            :查看结果,中文部分已经是3F 3F。(?的ASCII码)
        判断:问题应该出在系统在执行getBytes时的转码,噢,明白了,系统当前的字符集是ISO8859_1(ASCII),不
              支持中文转换。
        第三步: 
     :改成 账套名.getBytes("UTF-8"),
            :查看结果,中文部分没有丢失转码,获得了正确的UTF-8编码。
        解决方法:
     添加encode方法,将中文字符串转换为UTF-8编码,然后格式化为字串方式。
            添加decode方法,将字串转回中文。

        问题的解决过程很简单,但在处理问题时,了解了Java字串的一些原理。
        1:java对于String的存储,与C++的char * 和COM的BSTR一样,只保存字节流,不包含编码信息。
           但是,在java的内核存储时,采用了统一的Unicode的(UTF16编码),也就是一个字符采用固定的两字节存储。
        2:java的String在进行任何转换时,由于1的存储方式,那么,源编码是UTF16,目的字符串必须指定,否则,采用默认。
        3:系统默认的字符集,是取JVM中的file.encoding属性,该属性依赖于具体的操作系统。
        4:如果目的字符集找不到对应的转码,如采用ISO8859_1来转换中文,会变为3F(?)。

        附:关于UTF-16,还会有前缀,叫做BOM。大致作用如下:
        UTF的字节序和BOM
        UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?
        Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:在UCS编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。
        这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。
        UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
        Windows就是使用BOM来标记文本文件的编码方式的。


    展开全文
  • Java字符集编码与转码

    2017-11-22 21:27:00
    Java字符的class代码总是Unicode字符集的UTF-16编码,运行时内存中的字符串在没有指定编码的时候也总是Unicode编码。 Java编译时候,会将java文件的编码按照指定编码或者(系统默认的)编码转换为Unicode并加载到...
    Java字符的class代码总是Unicode字符集的UTF-16编码,运行时内存中的字符串在没有指定编码的时候也总是Unicode编码。
     
    Java编译时候,会将java文件的编码按照指定编码或者(系统默认的)编码转换为Unicode并加载到内存中进行编译。
     
    下面给出一个Java转码工具,没有测试过,呵呵:
     
    package lavasoft.common; 

    import org.apache.commons.logging.Log; 
    import org.apache.commons.logging.LogFactory; 

    import java.io.*; 

    /** 
    * 转码工具,全面支持文件、字符串的转码 

    * @author Administrator 2009-11-29 16:14:21 
    */
     
    public class EncodingToolkit { 
            private static Log log = LogFactory.getLog(EncodingToolkit.class); 

            public static void main(String[] args) { 
                    String han = "汉"


                    System.out.println("---------"); 
            } 

            /** 
             * 对字符串重新编码 
             * 
             * @param text                字符串 
             * @param resEncoding 源编码 
             * @param newEncoding 新编码 
             * @return 重新编码后的字符串 
             */
     
            public static String reEncoding(String text, String resEncoding, String newEncoding) { 
                    String rs = null
                    try { 
                            rs = new String(text.getBytes(resEncoding), newEncoding); 
                    } catch (UnsupportedEncodingException e) { 
                            log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码"); 
                            throw new RuntimeException(e); 
                    } 
                    return rs; 
            } 

            /** 
             * 重新编码Unicode字符串 
             * 
             * @param text                源字符串 
             * @param newEncoding 新的编码 
             * @return 指定编码的字符串 
             */
     
            public static String reEncoding(String text, String newEncoding) { 
                    String rs = null
                    try { 
                            rs = new String(text.getBytes(), newEncoding); 
                    } catch (UnsupportedEncodingException e) { 
                            log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + newEncoding); 
                            throw new RuntimeException(e); 
                    } 
                    return rs; 
            } 

            /** 
             * 文本文件重新编码 
             * 
             * @param resFile         源文件 
             * @param resEncoding 源文件编码 
             * @param distFile        目标文件 
             * @param newEncoding 目标文件编码 
             * @return 转码成功时候返回ture,否则false 
             */
     
            public static boolean reEncoding(File resFile, String resEncoding, File distFile, String newEncoding) { 
                    boolean flag = true
                    InputStreamReader reader = null
                    OutputStreamWriter writer = null
                    try { 
                            reader = new InputStreamReader(new FileInputStream(resFile), resEncoding); 
                            writer = new OutputStreamWriter(new FileOutputStream(distFile), newEncoding); 
                            char buf[] = new char[1024 * 64];         //字符缓冲区 
                            int len; 
                            while ((len = reader.read(buf)) != -1) { 
                                    writer.write(buf, 0, len); 
                            } 
                            writer.flush(); 
                            writer.close(); 
                            reader.close(); 
                    } catch (FileNotFoundException e) { 
                            flag = false
                            log.error("没有找到文件,转码发生异常!"); 
                            throw new RuntimeException(e); 
                    } catch (IOException e) { 
                            flag = false
                            log.error("读取文件为一个内存字符串失败,失败原因是读取文件异常!"); 
                            throw new RuntimeException(e); 
                    } finally { 
                            if (reader != nulltry { 
                                    reader.close(); 
                            } catch (IOException e) { 
                                    flag = false
                                    throw new RuntimeException(e); 
                            } finally { 
                                    if (writer != nulltry { 
                                            writer.close(); 
                                    } catch (IOException e) { 
                                            flag = false
                                            throw new RuntimeException(e); 
                                    } 
                            } 
                    } 
                    return flag; 
            } 

            /** 
             * 读取文件为一个Unicode编码的内存字符串,保持文件原有的换行格式 
             * 
             * @param resFile    源文件对象 
             * @param encoding 文件字符集编码 
             * @return 文件内容的Unicode字符串 
             */
     
            public static String file2String(File resFile, String encoding) { 
                    StringBuffer sb = new StringBuffer(); 
                    try { 
                            LineNumberReader reader = new LineNumberReader(new BufferedReader(new InputStreamReader(new FileInputStream(resFile), encoding))); 
                            String line; 
                            while ((line = reader.readLine()) != null) { 
                                    sb.append(line).append(System.getProperty("line.separator")); 
                            } 
                            reader.close(); 
                    } catch (UnsupportedEncodingException e) { 
                            log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + encoding); 
                            throw new RuntimeException(e); 
                    } catch (FileNotFoundException e) { 
                            log.error("读取文件为一个内存字符串失败,失败原因所给的文件" + resFile + "不存在!"); 
                            throw new RuntimeException(e); 
                    } catch (IOException e) { 
                            log.error("读取文件为一个内存字符串失败,失败原因是读取文件异常!"); 
                            throw new RuntimeException(e); 
                    } 
                    return sb.toString(); 
            } 

            /** 
             * 使用指定编码读取输入流为一个内存Unicode字符串,保持文件原有的换行格式 
             * 
             * @param in             输入流 
             * @param encoding 构建字符流时候使用的字符编码 
             * @return Unicode字符串 
             */
     
            public static String stream2String(InputStream in, String encoding) { 
                    StringBuffer sb = new StringBuffer(); 
                    LineNumberReader reader = null
                    try { 
                            reader = new LineNumberReader(new BufferedReader(new InputStreamReader(in, encoding))); 
                            String line; 
                            while ((line = reader.readLine()) != null) { 
                                    sb.append(line).append(System.getProperty("line.separator")); 
                            } 
                            reader.close(); 
                            in.close(); 
                    } catch (UnsupportedEncodingException e) { 
                            log.error("读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + encoding); 
                            throw new RuntimeException(e); 
                    } catch (IOException e) { 
                            log.error("读取文件为一个内存字符串失败,失败原因是读取文件异常!"); 
                            throw new RuntimeException(e); 
                    } finally { 
                            if (in != nulltry { 
                                    in.close(); 
                            } catch (IOException e) { 
                                    log.error("关闭输入流发生异常!", e); 
                                    throw new RuntimeException(e); 
                            } 
                    } 
                    return sb.toString(); 
            } 

            /** 
             * 字符串保存为制定编码的文本文件 
             * 
             * @param text         字符串 
             * @param distFile 目标文件 
             * @param encoding 目标文件的编码 
             * @return 转换成功时候返回ture,否则false 
             */
     
            public static boolean string2TextFile(String text, File distFile, String encoding) { 
                    boolean flag = true
                    if (!distFile.getParentFile().exists()) distFile.getParentFile().mkdirs(); 
                    OutputStreamWriter writer = null
                    try { 
                            writer = new OutputStreamWriter(new FileOutputStream(distFile), encoding); 
                            writer.write(text); 
                            writer.close(); 
                    } catch (IOException e) { 
                            flag = false
                            log.error("将字符串写入文件发生异常!"); 
                            throw new RuntimeException(e); 
                    } finally { 
                            if (writer != nulltry { 
                                    writer.close(); 
                            } catch (IOException e) { 
                                    log.error("关闭输出流发生异常!", e); 
                                    throw new RuntimeException(e); 
                            } 
                    } 
                    return flag; 
            } 
    }
     


    本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/236392,如需转载请自行联系原作者
    展开全文
  • java 传递字符串给php,整体方法采用跨语言json传递,但一些字符传递有问题。结果php有些字符没法解析,比如“=,[]”等号,中括号等,用md5加密,java可以加密了,自己解密,php不行。起初用base64 转下码,java...

    java 传递字符串给php,整体方法采用跨语言json传递,但一些字符传递有问题。

    结果php有些字符没法解析,比如“=,[]”等号,中括号等,用md5加密,java可以加密了,自己解密,php不行。

    起初用base64 转下码,java和php倒是通用,不过转出好多等号,php又不行了。

    最后 java用base64 转码两次,php解码两次的方案解决。

    java: BASE64.encode(BASE64.encode("目标字符"));
    php:base64_decode (base64_decode ("加密字符串"));
    
    

    展开全文
  • 出最保险的转码操作,既无视平台编码,也无视字符编码: /** 保证接收到的字符串转为 UTF-8 格式 * 以 UTF-8 格式编码,再以 ...1. 对字符串的编解码使用了如下四个方法( java.lang.String ),还有其它的...

    先给出最保险的转码操作,既无视平台编码,也无视字符编码:

    /** 保证接收到的字符串转为 UTF-8 格式
     *    以 UTF-8 格式编码,再以 UTF-8 格式解码
     */
    val strUTF8 = new String(strGBK.getBytes("UTF-8"), "UTF-8")

    1. 对字符串的编解码使用了如下四个方法( java.lang.String ),还有其它的几个方法差不多,这里不说了:
         | getBytes(charsetName) :
    按指定字符编码格式将 字符串 编码 为字节数组;
         | getBytes() :按平台默认字符编码格式将 字符串 编码 为字节数组;
         | String(bytes, offset, length, charsetName):按指定字符编码格式将 字节数组 解码 为字符串,并指定数组起始;
         | String(bytes, charsetName):按指定字符编码格式将 字节数组 解码 为字符串,按字节数组的默认起始;

        /**
         * @param  charsetName
         *         The name of a supported {@linkplain java.nio.charset.Charset
         *         charset}
         *
         * @return  The resultant byte array
         */
        public byte[] getBytes(String charsetName);
    
        /* @param  bytes
         *         The bytes to be decoded into characters
         *
         * @param  offset
         *         The index of the first byte to decode
         *
         * @param  length
         *         The number of bytes to decode
    
         * @param  charsetName
         *         The name of a supported {@linkplain java.nio.charset.Charset
         *         charset}
         */
        public String(byte bytes[], int offset, int length, String charsetName);
    
        /**
         * @return  The resultant byte array
         */
        public byte[] getBytes();
    
        /**
         * @param  bytes
         *         The bytes to be decoded into characters
         *
         * @param  charsetName
         *         The name of a supported {@linkplain java.nio.charset.Charset
         *         charset}
         */
        public String(byte bytes[], String charsetName);

     

    2. 中文字符 在 GBK 与 UTF-8 间的转换:
         | 因为中文字符 以 GBK 编码时占2个字节,以 UTF-8 编码时占3个字节;
         | 所以从 UTF-8 格式转为 GBK 格式时,只是丢失了高位字节
    ,不会存在问题
        
    | 但如果 GBK 格式转为 UTF-8 格式时,不存在 UTF-8 的高位字节,所以会出现乱码;
         | 幸好这一切 java.lang.String 都处理好了。
         | *** 【慎用】 如下第二中方式,指定字节数组长度,除非指定正确;
          —| 1) 小于 UTF-8 格式编码时的字节长度,结果是最后的几个中文字符出现乱码;
          —| 2) 大于 UTF-8 格式编码时的字节长度,结果是数组下标越界异常。

    // 1. 使用默认的字节数组长度
    val strUTF8 = new String(strGBK.getBytes("UTF-8"), "UTF-8")
    // 2. 或者 指定转为UTF-8的字节长度
    //    这种方式如果指定的字节数组小于UTF-8编码后的字节数组长度,最后几个中文字符会出现乱码
    val strUTF8 = new String(strGBK.getBytes("UTF-8"), 0, strGBK.length()*3, "UTF-8")
    // 3. (推荐)使用 UTF-8 编解码格式
    val strUTF8 = new String(strGBK.getBytes("UTF-8"), "UTF-8")

    3. 完整测试代码(scala/java): 

    object a extends App {
      
      testUTF8ToGBK
      testGBKToUTF8
      
      def testUTF8ToGBK = {
        println("-------------------[Test UTF8 To GBK]-------------------------")
        val strBytes = new String("中文").getBytes("UTF-8")
        println("strBytes: " + strBytes.mkString(" "))
        
        val strUTF8 = new String(strBytes, "UTF-8")
        println("strUTF8 Bytes: " + strUTF8.getBytes("UTF-8").mkString(" "))
        
        // 使用默认的字节数组长度
        val strGBK = new String(strUTF8.getBytes("GBK"), "GBK")
    //    // 或者 指定转为GBK的字节长度
    //    val strGBK = new String(strUTF8.getBytes("GBK"), 0, strUTF8.length()*2, "GBK")
        println("strGBK Bytes: " + strGBK.getBytes("GBK").mkString(" "))
        
        println("strUTF8: " + strUTF8)
        println("strGBK: " + strGBK)
      }
      
      def testGBKToUTF8 = {
        println("-------------------[Test GBK To UTF8]-------------------------")
        val strBytes = new String("中文").getBytes("GBK")
        println("strBytes: " + strBytes.mkString(" "))
        
        val strGBK = new String(strBytes, "GBK")
        println("strGBK Bytes: " + strGBK.getBytes("GBK").mkString(" "))
        
    //    // 1. 使用默认的字节数组长度
    //    val strUTF8 = new String(strGBK.getBytes("UTF-8"), "UTF-8")
    //    // 2. 或者 指定转为UTF-8的字节长度
    //    //    这种方式如果指定的字节数组小于UTF-8编码后的字节数组长度,会出现乱码
    //    val strUTF8 = new String(strGBK.getBytes("UTF-8"), 0, strGBK.length()*3, "UTF-8")
        // 3. (推荐)使用 UTF-8 编解码格式
        val strUTF8 = new String(strGBK.getBytes("UTF-8"), "UTF-8")
        println("strUTF8 Bytes: " + strUTF8.getBytes("UTF-8").mkString(" "))
        
        println("strGBK: " + strGBK)
        println("strUTF8: " + strUTF8)
      }
      
    }
    -------------------[Test UTF8 To GBK]-------------------------
    strBytes: -28 -72 -83 -26 -106 -121
    strUTF8 Bytes: -28 -72 -83 -26 -106 -121
    strGBK Bytes: -42 -48 -50 -60
    strUTF8: 中文
    strGBK: 中文
    -------------------[Test GBK To UTF8]-------------------------
    strBytes: -42 -48 -50 -60
    strGBK Bytes: -42 -48 -50 -60
    strUTF8 Bytes: -28 -72 -83 -26 -106 -121
    strGBK: 中文
    strUTF8: 中文
    

     

    展开全文
  • java实现网络图片转换为base64字符串

    千次阅读 2018-01-03 18:49:34
    功能需求:将网络图片转换为base64字符串前端 lg:String url = "https://www.baidu.com/369270f.jpg"; base64转码之后: url = "/9j/4AAQSkZJRg......G9AFqq6"; 代码实现: package test; import java.io....
  • ,那么如何才能将ISO-8859-1编码形式的字串转成日语字符串‘汉语字符串等。。。? [b]问题补充:[/b] 所有的编码都用UTF-8不就可以了,不使用ISO-8859-1编码 UTF-8编码占三个字节,也是通用的编码,GOOGLE也是用的...
  • 但是在所有环境因素上,保证了编码方式之后,也会有前台传递后台【get方式提交】传递后台的编码方式是非UTF-8的,也会有例如FTP服务器的编码方式是非UTF-8的,所以需要在程序中代码进行编码方式的转码。...
  • 没有UTF-8这种编码,你解决地代码:  private static final String inCode = "ISO-8859-1 ";  private static final String outCode = "gb2312 ";  /**  * 转换字符串编码ISO-8
  • 转码也没见到!java是跨平台语言,之所以跨平台是因为java语言本身就带着一个平台,java运行在虚拟机之上;灵活是以不灵活为基础的,总会找到不灵活的那个点吧;C++标准库的输入输出是通过什么来实现的?操作系统?...
  • 直接在浏览器中参数带中文,在java servlet中无法接受,并转换为中文. 举例如下: 开启一个IE.输入如下: search/index.jsp?q=中国 然后接受 String q = request.getParameter("q");// System....
  • =======某个字符串转码======= 如何转码: dos下输入:native2ascii -encoding gbk 回车后输入中文就可显示转码后字符串 注意:不指定编码(encoding )则默认为本地编码,我们使用一般默认为gbk.有些工程使用的...
  • 页面为UTF-8,jQuery的ajax方法为utf-8传值,中文会出现乱码,给Java页面传值时需要进行两次转码encodeURI();例如:$.post("page.do",{str:encodeURI(encodeURI("中文"))},function(data){alert(data);})程序页面...
  • 页面为UTF-8,jQuery的ajax方法为utf-8传值,中文会出现乱码,给Java页面传值时需要进行两次转码encodeURI(); 例如: $.post("page.do",{str:encodeURI(encodeURI("中文"))},function(data){alert(data);}) 程序...
  • 页面为UTF-8,jquery的ajax方法为utf-8传值,中文会出现乱码,给java页面传值时需要进行两次转码encodeURI(); 例如: $.post("page.do",{str:encodeURI(encodeURI("中文"))},function(data){alert(data);}) 程序...
  • 流程:前端通过file标签选择视频文件,通过base64转码为一个字符串,后台通过工具解码,得到视频流,保存在本地,代码中有默认保存路径,也会自动帮你创建,得到保存后的本地视频路径,通过阿里云的jdk里面的代码...
  • 页面为UTF-8,jquery的ajax方法为utf-8传值,中文会出现乱码,给java页面传值时需要进行两次转码encodeURI(); 例如: $.post("page.do",{str:encodeURI(encodeURI("中文"))},function(data){alert(data);}) 程序页面...
  • 生成视频可能的方案纯前端的视频编码转换(例如WebM Encoder Whammy)图片地址只能是相对地址音乐不能收录生成的视频需要下载再上传将每帧图片传后端实现,由后端调用FFmpeg进行视频转码截图多的时候,base64字符串...
  • 1、ios端进行支付,然后收到苹果的一串数据(也叫收据),然后ios端将其转码为BASE64编码的字符串。 2、ios端请求服务端接口,将数据传服务端,服务端拿到数据后,通过一系列处理后,请求苹果服务器,验证此收据...
  • 有些项目经常用到Xml和和对象互转,常常遇到Xml字符串拼错、以及一些括号需要转码的问题, 目前开源的xml 转obj 库使用起来极为不方便,效率也比较低,例如SimpleXml,和betwixt,下面大家介绍一款新的xml和java互...
  • BASE64Encoder 转BASE64

    千次阅读 2011-04-15 20:13:00
     在项目中需要把数据库中的图片转成BASE64传页面控件...  尝试去掉转码字符串种的换行符、空格,结果传控件可以正常显示图像  当出现传递过个图像时发现JAVA对于这种处理耗时太经过在网上查找
  • OGNL访问集合类数据

    2013-05-27 17:52:09
    在这一讲中,你会学到OGNL表达式语言和访问Java集合类(像Arrays,Lists和Maps)的语法。 注意42行到47行,可以用来治理...把字符串单独拿出来放到temp中,我就可以转码了! <%@ page language="java" contentT
  • * 对非注释的一行字符串进行unicode转码,该字符串格式要求为key=value形式 * 即如:userName=xiaoxin。否则会抛出异常 * * @param non_comments * 非注释字符串 * @return */ public static String ...
  • 但是都不行,网上查了一下,都没有找到原因,最后只能先将单数字符串后面加了一个_字符,那边再截取。 另外好像firefox正常,IE和360都有乱码。[/color] 之前在网上看见一个哥们说: 当用ie提交时,单个汉字会...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

java给字符串转码

java 订阅