解决svn list 显示中文乱码问题的方法

一、背景

我们使用svn pre-commit hook做了一个svn锁定的功能,对于在上线前的svn提交进行控制,防止开发及策划胡乱提交,导致线上bug。这个平台有一个web界面功能,可以争对性给某些人开通一次提交权限,并记录他这一次的提交文件和log,乱码就出现了,web界面上显示的中文均乱码,包括log和提交文件名称

乱码的格式是:/design/X_?229?175?188?229?133?165?230?149?176?230?141?174/04_?233?129?147?229?133?183?230?149?176?230?141?174?232?161?168/?229?149?134?229?186?151?230?149?176?230?141?174?232?161?168.xls 这样的;

例如web上乱码为:

14370127901362.png

对应实际的中文汉字为:

14370128636098.png

二、原因

字符编码的问题,大家都知道,主要是ascii编码和unicode、utf-8之间的转换。关于字符编码,可以看阮一峰老师的文章,解析简单透彻:http://www.ruanyifeng.com/blog ... .html

上述乱码基本是?229格式的,其中的?应该是svn自己加的分隔符,后面的三位数字为ascii编码,我们可以通过ascii转字符的函数将它转换成字符,将上述所有ascii字符拼接到一起即可形成unicode编码,然后再转utf-8,即可得到UrlEncode之后的中文汉字,然后再UrlDecode即可;

三、解决

知道上述原理之后,我采用js解决,这样不用修改后端代码,服务器也不用reload,调试也会方便一些;如果你才用其他语言,比如python、java、php等去解析乱码。可以找对应的函数替换即可。

3.1 urldecode和urlencode

比如:http://www.111cn.net  /%E5%88%86%E5%B8%83%E5%BC%8F.html 这个链接里面的%E5%88%86%E5%B8%83%E5%BC%8F就是UrlEncode之后的中文,使用UrlDecode即可得到汉字“分布式”。关于这部分,网络博客很多,随便找;

Javascript方法如下:
function UrlDecode(zipStr){ 
    var uzipStr=""; 
    for(var i=0;i<zipStr.length;i++){ 
        var chr = zipStr.charAt(i); 
        if(chr == "+"){ 
            uzipStr+=" "; 
        }else if(chr=="%"){ 
            var asc = zipStr.substring(i+1,i+3); 
            if(parseInt("0x"+asc)>0x7f){ 
                uzipStr+=decodeURI("%"+asc.toString()+zipStr.substring(i+3,i+9).toString()); 
                i+=8; 
            }else{ 
                uzipStr+=AsciiToString(parseInt("0x"+asc)); 
                i+=2; 
            } 
        }else{ 
            uzipStr+= chr; 
        } 
    }
    return uzipStr; 
}
3.2 unicode转utf-8:EncodeUtf8

这部分代码网上找的,可能有bug,我用上没有什么问题,其他语言应该有更简单的方法:
function EncodeUtf8(s1) {
    var s = escape(s1);
    var sa = s.split("%");
    var retV = "";
    if (sa[0] != "") {
        retV = sa[0];
    }
    for (var i = 1; i < sa.length; i++) {
        if (sa[i].substring(0, 1) == "u") {
            retV += Hex2Utf8(Str2Hex(sa[i].substring(1, 5)));
        } else retV += "%" + sa[i];
    }
    return retV;
}
function Str2Hex(s) {
    var c = "";
    var n;
    var ss = "0123456789ABCDEF";
    var digS = "";
    for (var i = 0; i < s.length; i++) {
        c = s.charAt(i);
        n = ss.indexOf(c);
        digS += Dec2Dig(eval(n));
    }
    //return value;
    return digS;
}
function Dec2Dig(n1) {
    var s = "";
    var n2 = 0;
    for (var i = 0; i < 4; i++) {
        n2 = Math.pow(2, 3 - i);
        if (n1 >= n2) {
            s += '1';
            n1 = n1 - n2;
        } else
            s += '0';
    }
    return s;
}
function Dig2Dec(s) {
    var retV = 0;
    if (s.length == 4) {
        for (var i = 0; i < 4; i++) {
            retV += eval(s.charAt(i)) * Math.pow(2, 3 - i);
        }
        return retV;
    }
    return -1;
}
function Hex2Utf8(s) {
    var retS = "";
    var tempS = "";
    var ss = "";
    if (s.length == 16) {
        tempS = "1110" + s.substring(0, 4);
        tempS += "10" + s.substring(4, 10);
        tempS += "10" + s.substring(10, 16);
        var sss = "0123456789ABCDEF";
        for (var i = 0; i < 3; i++) {
            retS += "%";
            ss = tempS.substring(i * 8, (eval(i) + 1) * 8);
            retS += sss.charAt(Dig2Dec(ss.substring(0, 4)));
            retS += sss.charAt(Dig2Dec(ss.substring(4, 8)));
        }
        return retS;
    }
    return "";
}
3.3 解析SVN乱码

解析SVN格式乱码,获得每个字符的ascii,然后拼接unicode,然后转utf8,然后再UrlDecode,成功解析出汉字;
function svn_ascii_to_utf8(ori) {
  s = ori.split('?');
  //三个才是一个汉字,至少要有一个汉字
  if (s.length < 3) {
    return ori;
  }
  var ascii = '';
  for(i in s) {
    x = s[i];
    if (x.length == 3) {
      ascii += String.fromCharCode(x);
      //console.log(ascii);
    }
    else if (x.length > 3) {
      ascii += String.fromCharCode(x.substr(0, 3));
      ascii += x.substr(3);
    }
    else {
      //do nothing
    }
  }
  return UrlDecode(EncodeUtf8(ascii));
}
然后再web页面显示的时候,将相应的乱码,调用s = svn_ascii_to_utf8(s)即可,有乱码转乱码,无乱码保持不变;

时间: 2024-10-21 23:42:29

解决svn list 显示中文乱码问题的方法的相关文章

svn list 显示中文乱码解决办法

一.背景 我们使用svn pre-commit hook做了一个svn锁定的功能,对于在上线前的svn提交进行控制,防止开发及策划胡乱提交,导致线上bug.这个平台有一个web界面功能,可以争对性给某些人开通一次提交权限,并记录他这一次的提交文件和log,乱码就出现了,web界面上显示的中文均乱码,包括log和提交文件名称 乱码的格式是:/design/X_?229?175?188?229?133?165?230?149?176?230?141?174/04_?233?129?147?229?1

解决MySQL客户端输出窗口显示中文乱码问题的办法_Mysql

最近发现,在MySQL的dos客户端输出窗口中查询表中的数据时,表中的中文数据都显示成乱码,如下图所示: 上网查了一下原因:之所以会显示乱码,就是因为MySQL客户端输出窗口显示中文时使用的字符编码不对造成的,可以使用如下的命令查看输出窗口使用的字符编码:show variables like 'char%'; 命令执行完成之后显示结果如下所示: 可以看到,现在是使用utf8字符编码来显示中文数据的,但是因为操作系统是中文操作系统,默认使用的字符集是GB2312,所以需要把输出窗口使用的字符编码

编码-jsp网页中的js 显示中文乱码,在MyEclipse 里面显示的正常

问题描述 jsp网页中的js 显示中文乱码,在MyEclipse 里面显示的正常 index.jsp 页面 调用 外面的 .js 文件 中文显示乱码,看了好多都说是 网页编码 不一致造成的 <script type="text/javascript" src="webstyle/js/script.js" charset="GB2312"></script> 但是 我在Index.jsp页面调用的时候 加上 charset

eclipse for php 写的代码有中文但在网页中却显示中文乱码。

问题描述 eclipse for php 写的代码有中文但在网页中却显示中文乱码. eclipse for php 写的代码有中文但在网页中却显示中文乱码,试过网上的方法,仍无法解决,急~ 解决方案 1.设置一下php文件的编码格式,如utf-8 2.在php代码前面加一句header('content-type:text/html;charset=utf-8'); 3.确定浏览器用utf-8来解析

解决javaWEB中前后台中文乱码问题的3种方法_java

中文乱码问题真的是一个很棘手的问题,特别是从前台传到后台之后,都不知道问题出在哪里了.现在分享解决javaWEB中前后台中文乱码问题的3种方法.方法一:tomcat的自带编码是ISO-8859-1的格式,是不兼容中文的编码的.所以我们从后台接收的时候要注意. 采用相同的格式去接收(ISO-8859-1),然后用能解析的编码(utf-8)去转换.这样我们就能得到能兼容中文的格式了.这样处理之后发往前台.注意:发往前台的时候也需要设置一下resp.setContentType("text/html;

解决linux下vim中文乱码的方法_Linux

Vim编码的详细介绍 Vim和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,这当然包括 UCS-2.UTF-8 等流行的 Unicode 编码方式. Vim 有四个跟字符编码方式有关的选项,encoding.fileencoding.fileencodings.termencoding (这些选项可能的取值请参考 Vim 在线帮助  :help encoding-names),它们的意义如下:     1.encoding: Vim 内部使用的字符编码方式,包括 Vim 的

如何解决JQuery ajaxSubmit提交中文乱码

一般人使用是 jQuery(form).ajaxSubmit({ url: "ajaxsub.aspx?abc=test", type: "post", dataType: "json", success: data }); 分析:JQuery的AJAX提交,会将要提交的数据进行编码,使用encodeURIComponent在js中处理数据.因此,无论是 Firefox或者IE,提交的数据都是一致的,都是UTF-8编码后的数据. 查看Header

如何解决页面之间传输中文乱码的问题

如何解决页面之间传输中文乱码的问题hbzxf(阿好)http://www.cnblogs.com/hbzxf 有的时候我们需要在页面之间传输中文,但是.NET模认在Webconfig中为我们建立的编码格式为utf-8,于是在传输中文的时候变成了乱码,相应的接受也会是乱码信息,如何解决这个问题,我们可以用两种方法. 更改Webconfig中的编码方式,如下:1.在你的web.config中把编码 <globalization requestEncoding="utf-8" resp

Java中解决中文乱码问题的方法

Java中解决中文乱码问题的方法 public  String   chStr(String string){   if(string==null){      string="";   }else{      try{         string=(new String(string.getBytes("iso-8859-1"),"GB3212")).trim();      }catch(Exception e){         e.pr