php获取gb2312编码的汉字的首个字母

<?php

//取GB2312字符串首字母,原理是GBK汉字是按拼音顺序编码的.

function get_letter($input){

$dict=array(

'a'=>0xB0C4,

'b'=>0xB2C0,

'c'=>0xB4ED,

'd'=>0xB6E9,

'e'=>0xB7A1,

'f'=>0xB8C0,

'g'=>0xB9FD,

'h'=>0xBBF6,

'j'=>0xBFA5,

'k'=>0xC0AB,

'l'=>0xC2E7,

'm'=>0xC4C2,

'n'=>0xC5B5,

'o'=>0xC5BD,

'p'=>0xC6D9,

'q'=>0xC8BA,

'r'=>0xC8F5,

's'=>0xCBF9,

't'=>0xCDD9,

'w'=>0xCEF3,

'x'=>0xD188,

'y'=>0xD4D0,

'z'=>0xD7F9,

);

$str_1 = substr($input, 0, 1);

if ($str_1 >= chr(0x81) && $str_1 <= chr(0xfe))    {

$num = hexdec(bin2hex(substr($input, 0, 2)));

foreach ($dict as $k=>$v){

if($v>=$num)

break;

}

return $k;

}

else{

return $str_1;

}

}

echo get_letter('中');

echo get_letter('华');

echo get_letter('人');

echo get_letter('民');

echo get_letter('共');

echo get_letter('和');

echo get_letter('国');

echo get_letter('万岁');

?>

Ajax:缓存问题,编码问题最终解决方案

使用ajax(动态网站静态化)过程中,有时候总会遇到一些难题,浏览器兼容、编码、IE下的特殊处理等等,偶尔会搞的人头昏脑胀哭笑不得,这里列一些小贴士,或许有些用。

 

使用Javascript库

ajax(动态网站静态化)的流行和巨大威力,让我们重新审视了Javascript的开发,也直接促使各种库的出现。对于普通的开发者,使用一些适合自己的Javascript库不仅可以避免ajax(动态网站静态化)应用上的浏览器兼容等问题,也使其开发更加的稳定和高效。这里列一些我知晓的轻量级的Javascript库:

 

YUI:YAHOO出品,组件丰富强大健壮稳定,是团队协作开发的首选。

JQuery:灵活、高效,其基于CSS3 和XPath的选择器语法引擎非常的强大和完整。

Prototype:是一个非常优雅的Javascript库,最经典的莫过于$符号了,DWR,JQuery都被它吸引了。在它基础上出现了script.aculo.us。

Mootools:核心语法和Prototype比较类似,但是用过之后才知道什么叫简单轻巧和短小精悍。

 

编码问题

通过xml(标准化越来越近了)HttpRequest获取的数据,默认的字符编码是UTF-8,如果前端页面是GB2312或者其它编码,显示获取的数据就是乱码。通过xml(标准化越来越近了)HTTPRequest,POST的数据也是UTF-8编码,如果后台是GB2312或者其他编码也会出现乱码。解决方法:

统一到UTF-8。这也是国际化的必然趋势。

输出通过xml(标准化越来越近了)HttpRequest获取的文本文本时,在headers中增加文本声明(直接HTML声明没有作用)。如: 

PHP:header('Content-Type:text/html;charset=GB2312');

ASP:Response.Charset = "GB2312"

jsp(SUN企业级应用的首选):response.setHeader("Charset","GB2312");

WWW服务器上强制声明。比如:apache(Unix平台最流行的WEB服务器平台)下的配置:

AddDefaultCharset GB2312

这种情况主要是应对通过xml(标准化越来越近了)HttpRequest访问的文件是静态文件,无法声明headers的情况下。

静态页面一般都会经过apache(Unix平台最流行的WEB服务器平台)的deflate或gzip压缩,此时在上面情况下IE中,首次通过xml(标准化越来越近了)httpRequest获得的数据可以正常显示,但再获取数据显示时出现乱码,这次因为再次获取的数据来自缓存,可能由于浏览器解压缩的问题导致apache(Unix平台最流行的WEB服务器平台)设置的默认编码声明丢失。由于这种情况下一般是纯文本,可能还无法禁止缓存,可以设置xml(标准化越来越近了)httpRequest访问的文本文件不压缩来解决这个问题。

非UTF-8页面通过xml(标准化越来越近了)HttpRequest获取的文本文本输出前字符转码成unicode,或者编码直接是UTF-8,可以正常显示。如实例所示。

 

IE下的缓存问题

由于IE的缓存处理机制问题,每次通过xml(标准化越来越近了)HttpRequest访问动态页面返回的总是首次访问的内容,解决方法有:

客户端通过添加随机字符串解决。如: 

var url = 'http://dancewithnet.com/';

url +=  '?temp=' + new Date().getTime();

url +=  '?temp=' + Math.random();

在HTTP headers禁止缓存。如: 

HTTP:

<meta http-equiv="pragma" content="no-cache" />

<meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />

<meta http-equiv="expires" content="Thu, 01 Jan 1970 00:00:01 GMT" />

<meta http-equiv="expires" content="0" />

PHP:

header("Expires: Thu, 01 Jan 1970 00:00:01 GMT");

header("Cache-Control: no-cache, must-revalidate");

header("Pragma: no-cache");

ASP:

Response.expires=0

Response.addHeader("pragma","no-cache")

Response.addHeader("Cache-Control","no-cache, must-revalidate")

jsp(SUN企业级应用的首选):

response.addHeader("Cache-Control", "no-cache");

response.addHeader("Expires", "Thu, 01 Jan 1970 00:00:01 GMT");

在xml(标准化越来越近了)HttpRequest发送请求之前加上: 

xml(标准化越来越近了)HttpRequest.setRequestHeader("If-Modified-Since","0");

xml(标准化越来越近了)HttpRequest.send(null);

 

IE下的reponsexml(标准化越来越近了)问题

使用responsexml(标准化越来越近了)时,IE下只能接受.xml(标准化越来越近了)为后缀的xml(标准化越来越近了)文件,如果不能以.xml(标准化越来越近了)文件为结尾的,则需要如下处理:

在服务器端声明是xml(标准化越来越近了)文件类型。如:

PHP:header("Content-Type:text/xml(标准化越来越近了);charset=utf-8");

ASP:Response.ContentType = "text/xml(标准化越来越近了)";

jsp(SUN企业级应用的首选):response.setHeader("ContentType","text/xml(标准化越来越近了)");

利用responseText获取,然后封装成xml(标准化越来越近了)。

在ajax(动态网站静态化)应用上,JSON和JsonML是xml(标准化越来越近了)非常好的替代品。

让Aptana支持jQuery

此demo将指导您如何创建一个新的jQuery的项目,并获得与您的编码开始使用jQuery库的记录由Aptana提供。


 

  1. Access your projects.访问您的项目。
    1. Click the Project tab to view your Aptana projects.单击项目选项卡查看您的Aptana项目。
  2. Create a new jQuery project.创建一个新的jQuery的项目。
    1. From the Aptana File menu, select New > Project...从Aptana 文件菜单,选择新建 “> 项目...
      The New Project wizard opens.新建项目向导。
    2. On the New Project wizard, expand the Aptana Projects folder and select General Web Project .新建项目向导中,展开Aptana项目文件夹并选择一般的Web项目
    3. Click the Next button.单击下一步按钮。
    4. In the Project name: field, type a name for your new project.项目名称:字段中,键入新项目的名称。
    5. Click the Next button.单击下一步按钮。
    6. From the Select Ajax Libraries list, check the box next to jQuery .选择Ajax库列表中,勾选扩展 jQuery。Click Next .单击下一步
    7. On the Jaxer Support screen, click the Select All button if you want to automatically add Jaxer support to the project.Jaxer支持屏幕上,单击全选按钮,如果你想自动添加Jaxer为了支持这个项目。Click Next .单击下一步
    8. On the HTML Preview settings page, configure any special HTML preview settings for your project.HTML预览设置页,配置任何特殊的HTML预览为您的项目设置。Click Next .单击下一步
    9. Click the Finish button.点击完成按钮。

      Aptana creates a new jQuery project, which includes a lib folder for the jQuery library, a new jQuery-linked HTML template file named jquery_sample.htm , and a new Code Assist Profile. Aptana创建一个新的jQuery的项目,其中包括一对jQuery库,一个新的jQuery的lib文件夹挂HTML模板文件名为jquery_sample.htm,一个新的代码辅助资料。

      Open the jquery_sample.htm file in the HTML Editor by double-clicking on it.打开通过双击上按一下,在HTML编辑器jquery_sample.htm文件。Because jquery_sample.htm is now the active file, your jQuery profile now becomes the active Profile in the Code Assist Profiles View.因为jquery_sample.htm现在是积极的文件,您的jQuery的文件现已成为在代码辅助配置文件察看活动配置。

  3. Explore the jQuery project.探索了jQuery项目。
    1. Just below the open jquery_sample.htm file in the Editor, click the Preview tab.下方,在编辑器,单击预览选项卡打开jquery_sample.htm文件。
      Aptana displays a preview of the Local Links example from jQuery. Aptana显示了本地连结从jQuery的例子预览。
    2. Click the Source tab to return to the source view of jquery_sample.htm .单击选项卡返回的jquery_sample.htm源视图。
    3. In the Project View, expand your project folder to view the files in your jQuery project.在项目视图中,展开您的项目文件夹,以查看您的jQuery的项目中的文件。
    4. In the Code Assist Profiles View, expand the jquery_sample.htm project folder to view the documented JQuery library files.在代码辅助配置文件察看,展开jquery_sample.htm项目文件夹以查看文件jQuery库文件。<p>These are the files that will be available to you in Code Assist. <p>这些都是文件将在代码辅助你。
  4. Preview Code Assist.预览代码辅助。
    1. In your jquery_sample.js file, just inside of the $(document).ready(function(){...}); function, add the following line: $("p") .在您的jquery_sample.js文件,只是里面的$(document).ready(function(){...});函数,添加下面一行$("p")
    2. While entering that selector you should have seen documentation come up for how to use the $ function.尽管进入该选择你应该看到的文件来如何使用$功能了。
    3. Now insert your cursor just after " $("p") " and type .ad and press ctrl+space .现在,插入仅次于$("p")并输入您的光标.ad和按Ctrl +空格
      Code Assist displays a list of jQuery functions that begin with the letters "ad" (eg add, addClass, etc).代码辅助显示一个jQuery函数列表字母开头的“广告”(如添加,addClass,等)。Use Code Assist to help you code.使用代码辅助,以帮助您的代码。
  5. Start coding.开始编码。
    1. As you type, notice that Code Assist is now active for the jQuery objects and functions that you use.当您输入,请注意,代码辅助目前正积极为jQuery对象和功能,您使用。
    2. Press ctrl+space at any time to activate Code Assist. Ctrl +在任何时间空间来激活代码辅助。

AJAX乱码解决大全【精】


1、编码
      
编码比较常用的有:UTF-8GBKGB2312ISO-8859-1,除了iso-8859-1之外的其它三个编码都能很好的支持中文,但它们都兼容ISO-8859-1的编码(就是说无论编码怎么改变,只要是ISO-8859-1中的字符,永远不会出现乱码)。
     
这四种编码中,GB2312是中国规定的汉字编码,也可以说是简体中文的字符集编码;GBKGB2312的扩展,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名;UTF-8虽然也支持中文,但却GB码不兼容(编码值不同)UTF-8使用的是可变长的UNICODE编码,编码可能是116进制(即ISO-8859-1中的字符,其编码也是相同的)也有可能是2位或3位的16进制。UTF-8的优点是:1CPU字节顺序无关,可以在不同平台之间交流。2、容错能力高,任何一个字节损坏后,最多只会导致一个编码码位损失,不会链锁错误(GB码错一个字节就会整行乱码),所以在国际化处理中基本都是建议使用UTF-8作为编码。

2、文件的编码
     
文件编码最常使用的有两种:ANSIUTF-8,光看名字估计你都可以猜到了,ANSI就是我们保存文件时使用的默认编码,而UTF-8则需自己设置。对于编码的改变,我使用的工具是NOTEPADECLIPSENOTEPAD使用最简单,只要打开文件后在另存为中选择相应的编码就行了,而且它对编码的支持非常好;而在ECLIPSE中,只要稍微设置一下就行了,打开首选项,然后选择:常规->内容类型(ContentType),在右边选中你想改变保存编码的文件类型,然后在下方的缺省编码中改变其值,最后点击更新(UPDATE)按钮即可。


而在其它的编辑器中,默认保存的内容都是GB2312或者GBK(NOTEPAD中对应ANSI).而根据前面所说的UTF-8和GBK,GB2312等 的编码值是不同的这一点,可以知道,如果文件使用了UTF-8,那么字符编码就必须使用UTF-8,否则编码值的不同就可能造成乱码。而这也就是为什么那 么多的人使用了UTF-8编码后还会产生乱码的根本原因。(JS和JSP都是这个道理)
3、JSP,STRUTS等的中文乱码解决方案
     其实解决的方法只有一个:

request.setCharacterEncoding(encoding);

    方法只有一种,但处理方式就多种多样了,初学者会在JSP页面上直接使用,而有经验的程序员会使用过滤器。而现在所要说的方法也是过滤器。这里以统一使用 UTF-8作为编码作为例子说明。具体过程就不多说了,网上有很多教程。偷懒一点的,到TOMCAT中复制就行了。在TOMCAT的目录下 的"webapps"jsp-examples"WEB-INF"classes"filters"找到 SetCharacterEncodingFilter.java 这个类,放到你的程序中并配置好映射路径。配置好后基本上你的乱码问题就解决了。但要映射路径中需要注意的就是不能使用 '*'

  <filter-mapping>
    
<filter-name>Set Character Encoding</filter-name>
    
<servlet-name>*</servlet-name>
  
</filter-mapping>

像上面这样配置的话(可能也是网上大多教程的做法,想当年也是害苦了我),可能你只有JSP的乱码解决了,要解决STRUTS的乱码需要映射 *.do 或者 servletActionName。然后在初始化参数中设置encoding的值就行了。

<init-param>
      
<param-name>encoding</param-name>
      
<param-value>UTF-8</param-value>
</init-param>

当然,最重要的是要记得根据前面所说的方法,改变你所使用的编辑器保存文件的编码要与使用的字符编码一致。
而在JSP内容中,还是使用如网上教程所说的那种技俩,在所有页面的页首加入:

<%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding
="UTF-8"%>

至此,相信JSP,ACTION都不太可能出现乱码了。
4、资源文件的乱码解决方案
      资源文件谁都知道是国际化支持不可或缺的一部分,如果资源文件都出现乱码了那还了得?其实资源文件的乱码是很好解决的,其原因也是因为使用了UTF-8做 为JSP编码后,没有相应地改变资源文件的文件编码造成的,所以只要对资源文件保存的编码进行更正后,乱码问题也就解决了。当然,你的中文要使用 native2ascii 命令进行正确的转换。
5、调用JS时,JS内容乱码的解决方案。
     其实JS的乱码还是跟文件的编码有关系的,如果JS中有中文的话,那JS文件保存的编码就必须跟调用此JS的页面编码相同,否则,你的所有中文都要从JSP页面传给JS才会显示正常。可以看出对于调用JS出现的乱码是最容易解决的.

6、AJAX提交数据乱码,返回数据乱码的解决方案

     万变不离其宗,AJAX的乱码问题自然跟编码有关了,其实很多人跟我一样想到了对文件编码进行设置,并且在接数据时设置了requet的编码,在返回的数 据时设置了response的编码一切都以为会很顺利,可是这一切都是徒劳无功的,讨厌的乱码再一次出现在你眼前。在你试了N多种方法,包括JS自身的 escape,unescape方法后,你发现乱码仍然猖狂地出现在屏幕上。
    其实在试过这N多方法后,很多人都没发现,解决的方法其实很简单,而且其答案就在我们之前处理的JSP乱码之中。让我们先看一下AJAX的经典请求代码

xmlhttp.open( "post", url, async );
xmlhttp.setRequestHeader( "Content-Type", "text/html" );
xmlhttp.send( params );

通过前面的说明,不知道你现在看出端倪了没有。不知道是受了网上教程的影响还是其它方面影响,setRequestHeader并是万年不变的,也没人想过去改它,而问题就正好出在这个地方。回想一个JSP页面内容的编码设置,其中有这么一节:

contentType="text/html; charset=UTF-8"

现在知道问题了吧,所以我们要把第二句代码改为:

xmlhttp.setRequestHeader( "Content-Type", "text/html;charset=UTF-8" );

如果提交的是form,那么设置为"application/x-www-form-urlencoded; charset=UTF-8"

最后别忘了在返回数据时也设置上:

response.setContentType( "text/xml" );
response.setCharacterEncoding( "UTF-8" );

如果要问为什么的话,其实我们可以把xmlhttp看成是一个临时页面,它由浏览 器动态生成,主要作用是在后台获得请求的数据(可以看成是一个高级的iframe)。所以对于普通页面设置的编码,对它也要同样设置。而在servlet 中返回数据为什么要设置contentType和encoding其道理也是一样的。众所周知,jsp的最后形态就是servlet,而jsp页首设置的 那个内容其实也就是让生成的servlet中生成这么两句话:

response.setContentType( "text/html" );
response.setCharacterEncoding( "UTF-8" );

而pageEncoding则是跟jvm说明了这个页面的内容要使用什么编码保存(这跟之后生成的CLASS有关系)。所以在servlet设置response的编码也是理所当然的了。

response.setContentType("text/xml;charset=UTF-8");

response.setHeader("Pragma",   "no-cache");   //HTTP   1.0  

response.setDateHeader("Expires",   0);   //prevents   caching   at   the   proxy   server  

PrintWriter out = response.getWriter();

out.write(outXML);

out.flush();

out.close();

OK!这样向客户端写的数据中的中文也是UTF-8编码了,客户端js脚本获取到request.responseXML也好,responseText也好,里面的数据都不会有乱码了


标签: 乱码, 编码, utf, jsp

ajax返回中文乱码,servlet中的显示乱码,post提交的乱码问题,编码大总结

ajax返回中文乱码问题解决
使用ajax获取服务器数据返回给客户端,出现中文乱码。在之前的一个ajax应用中指定codepage=936,将所有页面编码都指定为GB2312即可解决。
这 次的应用中却无起作用了,经过多次的试验,客服端的编码应该绝对没有问题的。可以判断问题一定出在服务器端。稍微分析一下可知虽然服务器端指定了文件的编 码格式,但对于服务器输出流就成为了怀疑的对象。 由于使用MS SQL2000,采用unicode编码,所以返回数据给客户端将会出现unicode编码的中文在gb2312编码页面显示的问题。于是在服务器端输出 流加一个HEADER:ASP程序中加入<%Response.Charset = "GB2312"%>即解决了这个问题。
同样在php和jsp程序中的书写类似
PHP:header('Content-Type:text/html;charset=GB2312');
JSP:response.setHeader("Charset","GB2312"); ajax产生乱码的原因整理如下
1、xtmlhttp 返回的数据默认的字符编码是utf-8,如果客户端页面是gb2312或者其它编码数据就会产生乱码
2、post方法提交数据默认的字符编码是utf-8,如果服务器端是gb2312或其他编码数据就会产生乱码
解决办法有:
1、若客户端是gb2312编码,则在服务器指定输出流编码
2、服务器端和客户端都使用utf-8编码JSP中,AJAX使用POST方式提交中文乱码问题解决

今天终于解决了AJAX的中文乱码问题,写篇文章来帮助一下有同样问题的朋友们。我的开发环境:XP, eclipse,使用GB18030编码。
当遇到这个问题时,到网上去查了好多文章,提到几种解决方案,如:全站UTF-8编码;请求头编码为中文;使用javascript中的escape函数。
使用GET方式提交数据的时候, 中文问题很好解决,setrequestheader("Content-Type","text/html; encoding=gb18030")就可以了。但这个方法在POST方式中却不起作用。大家都知道GET方式提交数据有长度限制,有时我们必须使用 POST方式来提交数据。
但对于POST方式,使用上述的几种方法经过多次测试,问题依旧。我郁闷了好几天。
今天把问题解决了,很简单,是使用escape(或encodeURI,两个函数javascript的函数,功能基本相同,可以查一下相关的帮助),但要使用两次,这是解决问题的关键。
我的例子涉及两个页面,一个是初始页面,一个是AJAX请求处理页面。
初始页面内容如下(hello.jsp):
/////////////////////////////////////////////////////////////////////////////////////
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%String path = request.getContextPath();%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>AJAX提交页面</title>
 <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
   <script type="text/javascript">
    function justdo(){
  var post="name=王&email=w@su.com&bokee=http://www.sjolzy.cn";
  post = encodeURI(post);
  post = encodeURI(post);//两次,很关键
  var xmlObj = new ActiveXObject('Msxml2.XMLHTTP');
  var URL = '<%= path%>/page/act.jsp';//文件名需要调整成测试时的相应位置?
  xmlObj.open ('post',URL,true);
  xmlObj.setrequestheader("cache-control","no-cache");
  xmlObj.setrequestheader("Content-Type","application/x-www-form-urlencoded");
  xmlObj.send (post);//注意:POST方式,使用这个来发送内容?
   }
   </script>
  </head> 
  <body>
  <input type="button" value="提交" onclick="justdo()"/>
   </body>
</html>
/////////////////////////////////////////////////////////////////////////////////////
ajax请求处理页面(act.jsp)的内容如下:
/////////////////////////////////////////////////////////////////////////////////////
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%String path = request.getContextPath();%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@page import="java.net.URLDecoder"%>
<html>
  <head>
    <title>ajax deal</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
  </head>
  <body>
  <%
  //遍历输出参数内容。
  for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
   String h = (String) e.nextElement();
   String v = request.getParameter(h);
   String mm =  java.net.URLDecoder.decode(v, "UTF-8");
   System.out.println("请求参数: " + h + " = " + mm);
  }
   %>
  </body>
</html>
/////////////////////////////////////////////////////////////////////////////////////
分析:当调用request.getParameter()函数时,会自动进行一次URI的解码过程,调用时内置的解码过程会导致乱码出现。而URI编 码两次后,request.getParameter()函数得到的是原信息URI编码一次的内容。再用可控的解码函数 java.net.URLDecoder.decode()就可解出原始的正确的信息。
以上分析纯属个人看法,不知是否正确。
========================
最后是servlet的问题呵呵,功夫不负有心人啊!!终于搞明白了,很简单:  
  1)   JSP中只要加入   <%@   page   contentType="text/html;charset=GB2312"   language="java"   %>   就能正确提交中文了!  
  2)servlet中分别对  
                1)   response.setContentType("text/html;   charset=gb2312");  
                2)     request.setCharacterEncoding("gb2312");  
  就可以正确的输出,和读取中文了!!  
  那么现在的问题就是如果用了struts,他给我们提供的servlet并没有加入  
  1)   response.setContentType("text/html;   charset=gb2312");  
  2)     request.setCharacterEncoding("gb2312");  
  所以在他调用我们写的actionform的时候就不能正确读取中文了,而我们只能写action,力所不能及。  
  那么怎么才能修改servlet呢?学习中!  
  谢谢大家,有好的建议继续哦 
====================
转码代码
    public static String iso2gb(String str) {
        if (str=="") {
        return "";
        }        String result = "";        try {
        byte[] tmp = str.getBytes("ISO8859_1");
        result = new String(tmp, "UTF-8");
        } catch (Exception e) {
            System.out.println(e);
        }        return result;
    }
===========================
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
    request.setCharacterEncoding("UTF-8");
%>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="Content-Language" content="UTF-8" />

标签: gb2312, 编码, POST, AJAX