转载地址:http://blog.csdn.net/feng_sundy/archive/2005/11/15/529944.aspx

世界上的各地区都有本地的语言。地区差异直接导致了语言环境的差异。在开发一个国际化程序的过程中,处理语言问题就显得很重要了。

  这是一个世界范围内都存在的问题,所以,Java提供了世界性的解决方法。本文描述的方法是用于处理中文的,但是,推而广之,对于处理世界上其它国家和地区的语言同样适用。

  汉字是双字节的。所谓双字节是指一个双字要占用两个BYTE的位置(即16位),分别称为高位和低位。中国规定的汉字编码为GB2312,这是强制性的,目前几乎所有的能处理中文的应用程序都支持GB2312。GB2312包括了一二级汉字和9区符号,高位从0xa1到0xfe,低位也是从0xa1到0xfe,其中,汉字的编码范围为0xb0a1到0xf7fe。

  另外有一种编码,叫做GBK,但这是一份规范,不是强制的。GBK提供了20902个汉字,它兼容GB2312,编码范围为0x8140到0xfefe。GBK中的所有字符都可以一一映射到Unicode 2.0。

  在不久的将来,中国会颁布另一种标准:GB18030-2000(GBK2K)。它收录了藏、蒙等少数民族的字型,从根本上解决了字位不足的问题。注意:它不再是定长的。其二字节部份与GBK兼容,四字节部分是扩充的字符、字形。它的首字节和第三字节从0x81到0xfe,二字节和第四字节从0x30到0x39。

  本文不打算介绍Unicode,有兴趣的可以浏览“http://www.unicode.org/”查看更多的信息。Unicode有一个特性:它包括了世界上所有的字符字形。所以,各个地区的语言都可以建立与Unicode的映射关系,而Java正是利用了这一点以达到异种语言之间的转换。

  在JDK中,与中文相关的编码有:

  表1 JDK中与中文相关的编码列表

编码名称 说明
ASCII 7位,与ascii7相同
ISO8859-1 8-位,与 8859_1,ISO-8859-1,ISO_8859-1,latin1...等相同
GB2312-80 16位,与gb2312,gb2312-1980,EUC_CN,euccn,1381,Cp1381, 1383, Cp1383, ISO2022CN,ISO2022CN_GB...等相同
GBK 与MS936相同,注意:区分大小写
UTF8 与UTF-8相同
GB18030 与cp1392、1392相同,目前支持的JDK很少

  在实际编程时,接触得比较多的是GB2312(GBK)和ISO8859-1。

  为什么会有“?”号

  上文说过,异种语言之间的转换是通过Unicode来完成的。假设有两种不同的语言A和B,转换的步骤为:先把A转化为Unicode,再把Unicode转化为B。

  举例说明。有GB2312中有一个汉字“李”,其编码为“C0EE”,欲转化为ISO8859-1编码。步骤为:先把“李”字转化为Unicode,得到“674E”,再把“674E”转化为ISO8859-1字符。当然,这个映射不会成功,因为ISO8859-1中根本就没有与“674E”对应的字符。

  当映射不成功时,问题就发生了!当从某语言向Unicode转化时,如果在某语言中没有该字符,得到的将是Unicode的代码“\uffffd”(“\u”表示是Unicode编码,)。而从Unicode向某语言转化时,如果某语言没有对应的字符,则得到的是“0x3f”(“?”)。这就是“?”的由来。

  例如:把字符流buf =“0x80 0x40 0xb0 0xa1”进行new String(buf, "gb2312")操作,得到的结果是“\ufffd\u554a”,再println出来,得到的结果将是“?啊”,因为“0x80 0x40”是GBK中的字符,在GB2312中没有。

  再如,把字符串String="\u00d6\u00ec\u00e9\u0046\u00bb\u00f9"进行new String (buf.getBytes("GBK"))操作,得到的结果是“3fa8aca8a6463fa8b4”,其中,“\u00d6”在“GBK”中没有对应的字符,得到“3f”,“\u00ec”对应着“a8ac”,“\u00e9”对应着“a8a6”,“0046”对应着“46”(因为这是ASCII字符),“\u00bb”没找到,得到“3f”,最后,“\u00f9”对应着“a8b4”。把这个字符串println一下,得到的结果是“?ìéF?ù”。看到没?这里并不全是问号,因为GBK与Unicode映射的内容中除了汉字外还有字符,本例就是最好的明证。

  所以,在汉字转码时,如果发生错乱,得到的不一定都是问号噢!不过,错了终究是错了,50步和100步并没有质的差别。

  或者会问:如果源字符集中有,而Unicode中没有,结果会如何?回答是不知道。因为我手头没有能做这个测试的源字符集。但有一点是肯定的,那就是源字符集不够规范。在Java中,如果发生这种情况,是会抛出异常的。


wwww.chin aitpower.comA8GS7iZj14UFuEmHNTTIELclR
  什么是UTF

  UTF,是Unicode Text Format的缩写,意为Unicode文本格式。对于UTF,是这样定义的:

  (1)如果Unicode的16位字符的头9位是0,则用一个字节表示,这个字节的首位是“0”,剩下的7位与原字符中的后7位相同,如“\u0034”(0000 0000 0011 0100),用“34” (0011 0100)表示;(与源Unicode字符是相同的);

  (2)如果Unicode的16位字符的头5位是0,则用2个字节表示,首字节是“110”开头,后面的5位与源字符中除去头5个零后的最高5位相同;第二个字节以“10”开头,后面的6位与源字符中的低6位相同。如“\u025d”(0000 0010 0101 1101),转化后为“c99d”(1100 1001 1001 1101);

  (3)如果不符合上述两个规则,则用三个字节表示。第一个字节以“1110”开头,后四位为源字符的高四位;第二个字节以“10”开头,后六位为源字符中间的六位;第三个字节以“10”开头,后六位为源字符的低六位;如“\u9da7”(1001 1101 1010 0111),转化为“e9b6a7”(1110 1001 1011 0110 1010 0111);

  可以这么描述JAVA程序中Unicode与UTF的关系,虽然不绝对:字符串在内存中运行时,表现为Unicode代码,而当要保存到文件或其它介质中去时,用的是UTF。这个转化过程是由writeUTF和readUTF来完成的。

  好了,基础性的论述差不多了,下面进入正题。

  先把这个问题想成是一个黑匣子。先看黑匣子的一级表示:

input(charsetA)->process(Unicode)->output(charsetB)

  简单,这就是一个IPO模型,即输入、处理和输出。同样的内容要经过“从charsetA到unicode再到charsetB”的转化。

  再看二级表示:

SourceFile(jsp,java)->class->output

  在这个图中,可以看出,输入的是jsp和java源文件,在处理过程中,以Class文件为载体,然后输出。再细化到三级表示:

jsp->temp file->class->browser,os console,db

app,servlet->class->browser,os console,db

  这个图就更明白了。Jsp文件先生成中间的Java文件,再生成Class。而Servlet和普通App则直接编译生成Class。然后,从Class再输出到浏览器、控制台或数据库等。

  JSP:从源文件到Class的过程

  Jsp的源文件是以“.jsp”结尾的文本文件。在本节中,将阐述JSP文件的解释和编译过程,并跟踪其中的中文变化。

  1、JSP/Servlet引擎提供的JSP转换工具(jspc)搜索JSP文件中用<%@ page contentType ="text/html; charset=<Jsp-charset>"%>中指定的charset。如果在JSP文件中未指定<Jsp-charset>,则取JVM中的默认设置file.encoding,一般情况下,这个值是ISO8859-1;

  2、jspc用相当于“javac –encoding <Jsp-charset>”的命令解释JSP文件中出现的所有字符,包括中文字符和ASCII字符,然后把这些字符转换成Unicode字符,再转化成UTF格式,存为JAVA文件。ASCII码字符转化为Unicode字符时只是简单地在前面加“00”,如“A”,转化为“\u0041”(不需要理由,Unicode的码表就是这么编的)。然后,经过到UTF的转换,又变回“41”了!这也就是可以使用普通文本编辑器查看由JSP生成的JAVA文件的原因;

  3、引擎用相当于“javac –encoding UNICODE”的命令,把JAVA文件编译成CLASS文件;

  先看一下这些过程中中文字符的转换情况。有如下源代码:

<%@ page contentType="text/html; charset=gb2312"%>
<html><body>
<%
 String a="中文";
 out.println(a);
%>
</body></html>

  这段代码是在UltraEdit for Windows上编写的。保存后,“中文”两个字的16进制编码为“D6 D0 CE C4”(GB2312编码)。经查表,“中文”两字的Unicode编码为“\u4E2D\u6587”,用 UTF表示就是“E4 B8 AD E6 96 87”。打开引擎生成的由JSP文件转变而成的JAVA文件,发现其中的“中文”两个字确实被“E4 B8 AD E6 96 87”替代了,再查看由JAVA文件编译生成的CLASS文件,发现结果与JAVA文件中的完全一样。

  再看JSP中指定的CharSet为ISO-8859-1的情况。

<%@ page contentType="text/html; charset=ISO-8859-1"%>
<html><body>
<%
 String a="中文";
 out.println(a);
%>
</body></html>

  同样,该文件是用UltraEdit编写的,“中文”这两个字也是存为GB2312编码“D6 D0 CE C4”。先模拟一下生成的JAVA文件和CLASS文件的过程:jspc用ISO-8859-1来解释“中文”,并把它映射到Unicode。由于ISO-8859-1是8位的,且是拉丁语系,其映射规则就是在每个字节前加“00”,所以,映射后的Unicode编码应为“\u00D6\u00D0\u00CE\u00C4”,转化成UTF后应该是“C3 96 C3 90 C3 8E C3 84”。好,打开文件看一下,JAVA文件和CLASS文件中,“中文”果然都表示为“C3 96 C3 90 C3 8E C3 84”。

  如果上述代码中不指定<Jsp-charset>,即把第一行写成“<%@ page contentType="text/html" %>”,JSPC会使用file.encoding的设置来解释JSP文件。在RedHat 6.2上,其处理结果与指定为ISO-8859-1是完全相同的。

  到现在为止,已经解释了从JSP文件到CLASS文件的转变过程中中文字符的映射过程。一句话:从“JspCharSet到Unicode再到UTF”。下表总结了这个过程:

  表2 “中文”从JSP到CLASS的转化过程

Jsp-CharSet JSP文件中 JAVA文件中 CLASS文件中
GB2312 D6 D0 CE C4(GB2312) 从\u4E2D\u6587(Unicode)到E4 B8 AD E6 96 87 (UTF) E4 B8 AD E6 96 87 (UTF)
ISO-8859-1 D6 D0 CE C4
(GB2312) 从\u00D6\u00D0\u00CE\u00C4 (Unicode)到C3 96 C3 90 C3 8E C3 84 (UTF) C3 96 C3 90 C3 8E C3 84 (UTF)
无(默认=file.encoding) 同ISO-8859-1 同ISO-8859-1 同ISO-8859-1

  下节先讨论Servlet从JAVA文件到CLASS文件的转化过程,然后再解释从CLASS文件如何输出到客户端。之所以这样安排,是因为JSP和Servlet在输出时处理方法是一样的。


  Servlet:从源文件到Class的过程

  Servlet源文件是以“.java”结尾的文本文件。本节将讨论Servlet的编译过程并跟踪其中的中文变化。

  用“javac”编译Servlet源文件。javac可以带“-encoding <Compile-charset>”参数,意思是“用< Compile-charset >中指定的编码来解释Serlvet源文件”。

  源文件在编译时,用<Compile-charset>来解释所有字符,包括中文字符和ASCII字符。然后把字符常量转变成Unicode字符,最后,把Unicode转变成UTF。

  在Servlet中,还有一个地方设置输出流的CharSet。通常在输出结果前,调用HttpServletResponse的setContentType方法来达到与在JSP中设置<Jsp-charset>一样的效果,称之为<Servlet-charset>。

  注意,文中一共提到了三个变量:<Jsp-charset>、<Compile-charset>和<Servlet-charset>。其中,JSP文件只与<Jsp-charset>有关,而<Compile-charset>和<Servlet-charset>只与Servlet有关。

  看下例:

import javax.servlet.*;

import javax.servlet.http.*;

class testServlet extends HttpServlet
{
 public void doGet(HttpServletRequest req,HttpServletResponse resp)
 throws ServletException,java.io.IOException
 {
  resp.setContentType("text/html; charset=GB2312");
  java.io.PrintWriter out=resp.getWriter();
  out.println("<html>");
  out.println("#中文#");
  out.println("</html>");
 }
}

  该文件也是用UltraEdit for Windows编写的,其中的“中文”两个字保存为“D6 D0 CE C4”(GB2312编码)。

  开始编译。下表是<Compile-charset>不同时,CLASS文件中“中文”两字的十六进制码。在编译过程中,<Servlet-charset>不起任何作用。<Servlet-charset>只对CLASS文件的输出产生影响,实际上是<Servlet-charset>和<Compile-charset>一起,达到与JSP文件中的<Jsp-charset>相同的效果,因为<Jsp-charset>对编译和CLASS文件的输出都会产生影响。

  表3 “中文”从Servlet源文件到Class的转变过程

Compile-charset Servlet源文件中 Class文件中 等效的Unicode码
GB2312 D6 D0 CE C4
(GB2312) E4 B8 AD E6 96 87 (UTF) \u4E2D\u6587 (在Unicode中=“中文”)
ISO-8859-1 D6 D0 CE C4
(GB2312) C3 96 C3 90 C3 8E C3 84 (UTF) \u00D6 \u00D0 \u00CE \u00C4 (在D6 D0 CE C4前面各加了一个00)
无(默认) D6 D0 CE C4 (GB2312) 同ISO-8859-1 同ISO-8859-1

  普通Java程序的编译过程与Servlet完全一样。

  CLASS文件中的中文表示法是不是昭然若揭了?OK,接下来看看CLASS又是怎样输出中文的呢?

  Class:输出字符串

  上文说过,字符串在内存中表现为Unicode编码。至于这种Unicode编码表示了什么,那要看它是从哪种字符集映射过来的,也就是说要看它的祖先。这好比在托运行李时,外观都是纸箱子,里面装了什么就要看寄邮件的人实际邮了什么东西。

  看看上面的例子,如果给一串Unicode编码“00D6 00D0 00CE 00C4”,如果不作转换,直接用Unicode码表来对照它时,是四个字符(而且是特殊字符);假如把它与“ISO8859-1”进行映射,则直接去掉前面的“00”即可得到“D6 D0 CE C4”,这是ASCII码表中的四个字符;而假如把它当作GB2312来进行映射,得到的结果很可能是一大堆乱码,因为在GB2312中有可能没有(也有可能有)字符与00D6等字符对应(如果对应不上,将得到0x3f,也就是问号,如果对应上了,由于00D6等字符太靠前,估计也是一些特殊符号,真正的汉字在Unicode中的编码从4E00开始)。

  各位看到了,同样的Unicode字符,可以解释成不同的样子。当然,这其中有一种是我们期望的结果。以上例而论,“D6 D0 CE C4”应该是我们所想要的,当把“D6 D0 CE C4”输出到IE中时,用“简体中文”方式查看,就能看到清楚的“中文”两个字了。(当然了,如果你一定要用“西欧字符”来看,那也没办法,你将得不到任何有何时何地的东西)为什么呢?因为“00D6 00D0 00CE 00C4”本来就是由ISO8859-1转化过去的。


  给出如下结论:

  在Class输出字符串前,会将Unicode的字符串按照某一种内码重新生成字节流,然后把字节流输入,相当于进行了一步“String.getBytes(???)”操作。???代表某一种字符集。

  如果是Servlet,那么,这种内码就是在HttpServletResponse.setContentType()方法中指定的内码,也就是上文定义的<Servlet-charset>。

  如果是JSP,那么,这种内码就是在<%@ page contentType=""%>中指定的内码,也就是上文定义的<Jsp-charset>。

  如果是Java程序,那么,这种内码就是file.encoding中指定的内码,默认为ISO8859-1。

  当输出对象是浏览器时

  以流行的浏览器IE为例。IE支持多种内码。假如IE接收到了一个字节流“D6 D0 CE C4”,你可以尝试用各种内码去查看。你会发现用“简体中文”时能得到正确的结果。因为“D6 D0 CE C4”本来就是简体中文中“中文”两个字的编码。

  OK,完整地看一遍。

  JSP:源文件为GB2312格式的文本文件,且JSP源文件中有“中文”这两个汉字

  如果指定了<Jsp-charset>为GB2312,转化过程如下表。

  表4 Jsp-charset = GB2312时的变化过程

序号 步骤说明 结果
1 编写JSP源文件,且存为GB2312格式 D6 D0 CE C4
(D6D0=中 CEC4=文)
2 jspc把JSP源文件转化为临时JAVA文件,并把字符串按照GB2312映射到Unicode,并用UTF格式写入JAVA文件中 E4 B8 AD E6 96 87
3 把临时JAVA文件编译成CLASS文件 E4 B8 AD E6 96 87
4 运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码 4E 2D 65 87(在Unicode中4E2D=中 6587=文)
5 根据Jsp-charset=GB2312把Unicode转化为字节流 D6 D0 CE C4
6 把字节流输出到IE中,并设置IE的编码为GB2312(作者按:这个信息隐藏在HTTP头中) D6 D0 CE C4
7 IE用“简体中文”查看结果 “中文”(正确显示)

  如果指定了<Jsp-charset>为ISO8859-1,转化过程如下表。

  表5 Jsp-charset = ISO8859-1时的变化过程

序号 步骤说明 结果
1 编写JSP源文件,且存为GB2312格式 D6 D0 CE C4
(D6D0=中 CEC4=文)
2 jspc把JSP源文件转化为临时JAVA文件,并把字符串按照ISO8859-1映射到Unicode,并用UTF格式写入JAVA文件中 C3 96 C3 90 C3 8E C3 84
3 把临时JAVA文件编译成CLASS文件 C3 96 C3 90 C3 8E C3 84
4 运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码 00 D6 00 D0 00 CE 00 C4
(啥都不是!!!)
5 根据Jsp-charset=ISO8859-1把Unicode转化为字节流 D6 D0 CE C4
6 把字节流输出到IE中,并设置IE的编码为ISO8859-1(作者按:这个信息隐藏在HTTP头中) D6 D0 CE C4
7 IE用“西欧字符”查看结果 乱码,其实是四个ASCII字符,但由于大于128,所以显示出来的怪模怪样
8 改变IE的页面编码为“简体中文” “中文”(正确显示)

  奇怪了!为什么把<Jsp-charset>设成GB2312和ISO8859-1是一个样的,都能正确显示?因为表4表5中的第2步和第5步互逆,是相互“抵消”的。只不过当指定为ISO8859-1时,要增加第8步操作,殊为不便。

  再看看不指定<Jsp-charset> 时的情况。

  表6 未指定Jsp-charset 时的变化过程

序号 步骤说明 结果
1 编写JSP源文件,且存为GB2312格式 D6 D0 CE C4
(D6D0=中 CEC4=文)
2 jspc把JSP源文件转化为临时JAVA文件,并把字符串按照ISO8859-1映射到Unicode,并用UTF格式写入JAVA文件中 C3 96 C3 90 C3 8E C3 84
3 把临时JAVA文件编译成CLASS文件 C3 96 C3 90 C3 8E C3 84
4 运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码 00 D6 00 D0 00 CE 00 C4
5 根据Jsp-charset=ISO8859-1把Unicode转化为字节流 D6 D0 CE C4
6 把字节流输出到IE中 D6 D0 CE C4
7 IE用发出请求时的页面的编码查看结果 视情况而定。如果是简体中文,则能正确显示,否则,需执行表5中的第8步

  Servlet:源文件为JAVA文件,格式是GB2312,源文件中含有“中文”这两个汉字

  如果<Compile-charset>=GB2312,<Servlet-charset>=GB2312

  表7 Compile-charset=Servlet-charset=GB2312 时的变化过程

序号 步骤说明 结果
1 编写Servlet源文件,且存为GB2312格式 D6 D0 CE C4
(D6D0=中 CEC4=文)
2 用javac –encoding GB2312把JAVA源文件编译成CLASS文件 E4 B8 AD E6 96 87 (UTF)
3 运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码 4E 2D 65 87 (Unicode)
4 根据Servlet-charset=GB2312把Unicode转化为字节流 D6 D0 CE C4 (GB2312)
5 把字节流输出到IE中并设置IE的编码属性为Servlet-charset=GB2312 D6 D0 CE C4 (GB2312)
6 IE用“简体中文”查看结果 “中文”(正确显示)

  如果<Compile-charset>=ISO8859-1,<Servlet-charset>=ISO8859-1

  表8 Compile-charset=Servlet-charset=ISO8859-1时的变化过程

序号 步骤说明 结果
1 编写Servlet源文件,且存为GB2312格式 D6 D0 CE C4
(D6D0=中 CEC4=文)
2 用javac –encoding ISO8859-1把JAVA源文件编译成CLASS文件 C3 96 C3 90 C3 8E C3 84 (UTF)
3 运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码 00 D6 00 D0 00 CE 00 C4
4 根据Servlet-charset=ISO8859-1把Unicode转化为字节流 D6 D0 CE C4
5 把字节流输出到IE中并设置IE的编码属性为Servlet-charset=ISO8859-1 D6 D0 CE C4 (GB2312)
6 IE用“西欧字符”查看结果 乱码(原因同表5)
7 改变IE的页面编码为“简体中文” “中文”(正确显示)

  如果不指定Compile-charset或Servlet-charset,其默认值均为ISO8859-1。

  当Compile-charset=Servlet-charset时,第2步和第4步能互逆,“抵消”,显示结果均能正确。读者可试着写一下Compile-charset<>Servlet-charset时的情况,肯定是不正确的。

  当输出对象是数据库时

  输出到数据库时,原理与输出到浏览器也是一样的。本节只是Servlet为例,JSP的情况请读者自行推导。

  假设有一个Servlet,它能接收来自客户端(IE,简体中文)的汉字字符串,然后把它写入到内码为ISO8859-1的数据库中,然后再从数据库中取出这个字符串,显示到客户端。

  表9 输出对象是数据库时的变化过程(1)

序号 步骤说明 结果 域
1 在IE中输入“中文” D6 D0 CE C4 IE
2 IE把字符串转变成UTF,并送入传输流中 E4 B8 AD E6 96 87
3 Servlet接收到输入流,用readUTF读取 4E 2D 65 87(unicode) Servlet
4 编程者在Servlet中必须把字符串根据GB2312还原为字节流 D6 D0 CE C4
5 编程者根据数据库内码ISO8859-1生成新的字符串 00 D6 00 D0 00 CE 00 C4
6 把新生成的字符串提交给JDBC 00 D6 00 D0 00 CE 00 C4
7 JDBC检测到数据库内码为ISO8859-1 00 D6 00 D0 00 CE 00 C4 JDBC
8 JDBC把接收到的字符串按照ISO8859-1生成字节流 D6 D0 CE C4
9 JDBC把字节流写入数据库中 D6 D0 CE C4
10 完成数据存储工作 D6 D0 CE C4 数据库
以下是从数据库中取出数的过程
11 JDBC从数据库中取出字节流 D6 D0 CE C4 JDBC
12 JDBC按照数据库的字符集ISO8859-1生成字符串,并提交给Servlet 00 D6 00 D0 00 CE 00 C4 (Unicode)  
13 Servlet获得字符串 00 D6 00 D0 00 CE 00 C4 (Unicode) Servlet
14 编程者必须根据数据库的内码ISO8859-1还原成原始字节流 D6 D0 CE C4  
15 编程者必须根据客户端字符集GB2312生成新的字符串 4E 2D 65 87
(Unicode)  
Servlet准备把字符串输出到客户端
16 Servlet根据<Servlet-charset>生成字节流 D6D0 CE C4 Servlet
17 Servlet把字节流输出到IE中,如果已指定<Servlet-charset>,还会设置IE的编码为<Servlet-charset> D6 D0 CE C4
18 IE根据指定的编码或默认编码查看结果 “中文”(正确显示) IE

  解释一下,表中第4第5步和第15第16步是用红色标记的,表示要由编码者来作转换。第4、5两步其实就是一句话:“new String(source.getBytes("GB2312"), "ISO8859-1")”。第15、16两步也是一句话:“new String(source.getBytes("ISO8859-1"), "GB2312")”。亲爱的读者,你在这样编写代码时是否意识到了其中的每一个细节呢?

  至于客户端内码和数据库内码为其它值时的流程,和输出对象是系统控制台时的流程,请读者自己想吧。明白了上述流程的原理,相信你可以轻松地写出来。

  行文至此,已可告一段落了。终点又回到了起点,对于编程者而言,几乎是什么影响都没有。

  因为我们早就被告之要这么做了。

  以下给出一个结论,作为结尾。

  1、 在Jsp文件中,要指定contentType,其中,charset的值要与客户端浏览器所用的字符集一样;对于其中的字符串常量,不需做任何内码转换;对于字符串变量,要求能根据ContentType中指定的字符集还原成客户端能识别的字节流,简单地说,就是“字符串变量是基于<Jsp-charset>字符集的”;

  2、 在Servlet中,必须用HttpServletResponse.setContentType()设置charset,且设置成与客户端内码一致;对于其中的字符串常量,需要在Javac编译时指定encoding,这个encoding必须与编写源文件的平台的字符集一样,一般说来都是GB2312或GBK;对于字符串变量,与JSP一样,必须“是基于<Servlet-charset>字符集的”。

posted @ 2008-07-23 14:02 小马歌 阅读(204) | 评论 (0)编辑 收藏
 
實際運用 Tomcat 5.0.19,我們了解在不修改 Tomcat 原始碼的狀況下,使用者透過 Form submit 的資料將一律以 ISO8859-1 處理,程式設計師必須自行將字串將轉換為 Big5(繁體中文) or GB2312/GBK(簡體中文),我們在應用程式中,對所有的 request.getParameter("xx"); 作了 toBig5String() 的處理,理論上,所有的中文問題應該不會出現才對,結果,還是發現某些狀況下,中文還是變成亂碼!

經過分析整理,我們發現問題出在 QueryString 的解析,以前在 Tomcat 4.x 時代,無論 SUBMIT 時採用 GET or POST,Tomcat server 對 parameters 的處理都採用相同的編碼,但在 Tomcat 5.x 版,不知何故,卻將 QueryString 的解析獨立出來,目前確認,Form 的 Method 採用 GET 及直接將參數寫在 URL 上的中文,上傳到 Tomcat 時,無論如何轉碼,都會變成亂碼,那怕你事先作過 URLEncode 也一樣。

網站上,有人針對這個問題,建議將所有中文改採用 base64 編碼,到了 server 上,程式將自行土 base64 decode 回來,確保中文不會發生問題。這樣作法當然可以解決這個問題,但是所有網頁變成限定要採用 POST,且程式設計師要隨時分清楚,那個參數是採用 GET 上傳,那個參數是採用 POST 上傳,然後再針對不同的方式採用不同的解析,這樣的程式一點兒移植性都沒有,更別提跨平台、跨國際語言了。

研究 Tomcat 的文件及原始碼,我們找到了問題所在及解決的方法,只有按著以下的作法,才能使 Form submit 的資料完全按著 ISO8859-1 的編碼,當然,若是全照著 Tomcat 的文件說明去作,肯定還是不行,你還是得加上這個參數到 server.xml 中才行。

解決方案

請先研究 $TOMCAT_HOME/webapps/tomcat-docs/config/http.html 這個說明檔,擷錄重點如下:
URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.

useBodyEncodingForURI:This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitely set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.

上述二個 Tomcat 參數,是設定在 server.xml 中的 http <Connector /> 區塊,要解決 QueryString 中文變成亂碼的問題,你必須至少設定這二個參數其中之一。
URIEncoding 請設定為 URIEncoding="ISO-8859-1" 指定為 "ISO-8859-1" 編碼,讓 QueryString 的字元編碼與 post body 相同。
useBodyEncodingForURI 這是用來相容 Tomcat 4.x 版的,設定的值是 "true" or "false",意思是指 "要不要讓 QueryString 與 POST BODY 採用相同的字元編碼 ?",若是設成 true,那也可達到 "ISO-8859-1" 編碼的需求。
建議,採用 URIEncoding 的設定,畢竟 useBodyEncodingForURI 的作法是為了相容 Tomcat 4.X。不過若照原文的說明,理論上這二個參數都不設,Tomcat 也該採用 "ISO-8859-1" 的編碼,那為什麼還是會有問題呢 ? 我們由 Tomcat Source Code 來看就清楚了。
// 這一段碼是 Tomcat 用來解 QueryString 的程式,
            // 在 org.apache.tomcat.util.http.Parameters 這個 class 裡。
            private String urlDecode(ByteChunk bc, String enc) throws IOException {
            if( urlDec==null ) {
            urlDec=new UDecoder();
            }
            urlDec.convert(bc);
            String result = null;
            if (enc != null) {
            bc.setEncoding(enc);
            result = bc.toString();
            }
            else {
            CharChunk cc = tmpNameC;
            cc.allocate(bc.getLength(), -1);
            // Default encoding: fast conversion
            byte[] bbuf = bc.getBuffer();
            char[] cbuf = cc.getBuffer();
            int start = bc.getStart();
            for (int i = 0; i < bc.getLength(); i++) {
            cbuf[i] = (char) (bbuf[i + start] & 0xff);
            }
            cc.setChars(cbuf, 0, bc.getLength());
            result = cc.toString();
            cc.recycle();
            }
            return result;
            }

請特別注意紅色區塊,當 Tomcat 發現 QueryString 並沒有設定 encode 時,並非像文件中所說預設採用 ISO-8859-1 的編碼,而是用一段 fast conversion 來處理,才會造成中文問題,所以,還是必須在 Server.xml 中,加上 URLEncoding 的參數設定才行哦。

Connector 的設定範例:
<Connector
            debug="0"
            acceptCount="100"
            connectionTimeout="20000"
            disableUploadTimeout="true"
            port="80"
            redirectPort="8443"
            enableLookups="false"
            minSpareThreads="25"
            maxSpareThreads="75"
            maxThreads="150"
            maxPostSize="0"
            URIEncoding="ISO-8859-1"
            >
 </Connector>
posted @ 2008-07-23 13:58 小马歌 阅读(343) | 评论 (0)编辑 收藏
 

linux环境中安装mysql需要

mysql-standard-4.0.24-pc-linux-gnu-i686.tar.gz这个文件

可以从http://dev.mysql.com/downloads/index.html下载

mysql-standard-4.0.24-pc-linux-gnu-i686.tar.gz 是mysql4.0.24版本的安装文件,是一个二进制的压缩包,所以我们的安装方式就为二进制分发安装。

安装步骤:

1.mysql-standard-4.0.24-pc-linux-gnu-i686.tar.gz 拷贝到一个目录中

2.shell>tar zvxfmysql-standard-4.0.24-pc-linux-gnu-i686.tar.gz

3.上面的命令将在当前目录下生成一个mysql-standard-4.0.24-pc-linux-gnu-i686文件夹

4.shell>mv mysql-standard-4.0.24-pc-linux-gnu-i686 /usr/local/mysql

5.上面的命令是将mysql-standard-4.0.24-pc-linux-gnu-i686下的所有东东,剪切到/usr/local/mysql 下,进行这一步是为了以后的方便。

6.shell> groupadd mysql         增加一个名为mysql的用户组

7.shell> useradd -g mysql mysql 在mysql用户组中加一个名为mysql的用户

如果上面的两个命令不能执行,那么要切换到root用户下执行

shell>su root -

8.shell>cd /usr/local/mysql

9.shell> cp support-files/my-medium.cnf /etc/my.cnf 

这时会问是否覆盖重名文件,回答y

10.shell> scripts/mysql_install_db --user=mysql

           以mysql用户初始化数据库,必须以mysql用户

11.shell> chown -R root .

注意后面有点,表示将当前目录下的所有文件与子目录的拥有者设

定为root用户

12.shell> chown -R mysql data

表示将当前目录下的data目录的拥有者设定为mysql用户

13.shell> chgrp -R mysql .

注意后面有点,表示将当前目录下的文件的文件组设为mysql组

14.shell> bin/mysqld_safe --user=root & 

此时如果没有出现“……ended”字样,大功告成!

15.回车显示shell>

 

此时你可以

l        通过shell>netstat –atln命令查看3306端口是否已经启用

l        也可以shell>ps -ef | grep mysqld 查看当前系统中的mysqld的进程

l        或直接 shell>bin/mysql –u root 进入mysql客户端,进行mysql操作

l        shell>bin/mysqladmin shutdown 停止mysql服务

 

记住:此时你的root用户是没有密码的,任何身份都可以用root进入,你可以

通过shell> bin/mysqladmin -u root password '新口令'来设定root用户的口令,此口令将在进入mysql客户端和停止mysql服务时需要输入

 

提示:在启单个服务的时候,可以通过修改/etc/my.cnf文件来配置

可以用VI编辑器打开my.cnf ,怎么打开呢,看下面,^_^

shell>vi my.cnf 打开my.cnf

找到下面这段

[mysqld] 

port = 8888 

socket = /tmp/mysql.sock 

可以在后面加上相应的配置

log = /var/log/mysql.log 

datadir = /free/mysqldbf 

log = /* 改变log的保存位置

datadir = /free/mysqldbf 改变data的保存位置


更全的安装文档 :http://21nw.com/wk/linux%E4%B8%8B%E5%AE%89%E8%A3%85MySQL%E7%9A%84%E5%A4%A7%E5%85%A8
posted @ 2008-07-22 14:21 小马歌 阅读(109) | 评论 (0)编辑 收藏
 
错误现象:
 java.lang.NoSuchMethodError: javax.xml.transform.dom.DOMResult.getNextSibling()Lorg/w3c/dom/Node;org.apache.xalan.transformer.TransformerIdentityImpl.createResultContentHandler(TransformerIdentityImpl.java:199)

问题分析:
问题出在Tomcat和jdk的兼容性上,如果用jdk1.5那么必须使用5.5.x系列的版本,反之亦然,如果和5.0.x系列的Tomcat搭配就会出现兼容问题导致报错。原来是因为使用了tomcat5.0它里面的xml-api.jar把jdk1.5里面的DOMResult冲掉了 ,tomcat5.5.17则不会有这个问题。

解决方案:
最后环境换成jdk1.5.06,tomcat换成5.5.17,问题解决
或者  把xalan解压包下的xml-apis.jar和xercesImpl.jar替换掉tomcat\commom/endorsed下的老版本的jar即可.
posted @ 2008-07-21 14:07 小马歌 阅读(667) | 评论 (0)编辑 收藏
 
1,apache-稳定,用户群体大,模块可选,逻辑处理。

Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上。
Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。

本来它只用于小型或试验Internet网络,后来逐步扩充到各种Unix系统中,尤其对Linux的支持相当完美。Apache有多种产品,可以支持SSL技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。到目前为止Apache仍然是世界上用的最多的Web服务器,市场占有率达60%左右。世界上很多著名的网站如Amazon.com、Yahoo!、W3 Consortium、Financial Times等都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。

Apache的诞生极富有戏剧性。当NCSA WWW服务器项目停顿后,那些使用NCSA WWW服务器的人们开始交换他们用于该服务器的补丁程序,他们也很快认识到成立管理这些补丁程序的论坛是必要的。就这样,诞生了Apache Group,后来这个团体在NCSA的基础上创建了Apache。

Apache web服务器软件拥有以下特性:

支持最新的HTTP/1.1通信协议

拥有简单而强有力的基于文件的配置过程

支持通用网关接口

支持基于IP和基于域名的虚拟主机

支持多种方式的HTTP认证

集成Perl处理模块

集成代理服务器模块

支持实时监视服务器状态和定制服务器日志

支持服务器端包含指令(SSI)

支持安全Socket层(SSL)

提供用户会话过程的跟踪

支持FastCGI

通过第三方模块可以支持Java Servlets

如果你准备选择Web服务器,毫无疑问Apache是你的最佳选择。

http://www.apache.org/是它的官方网站.

2,Lighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。lighttpd是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能,而Apache之所以流行,很大程度也是因为功能丰富,在lighttpd上很多功能都有相应的实现了,这点对于apache的用户是非常重要的,因为迁移到lighttpd就必须面对这些问题。

3, Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。尽管还是测试版,但是,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。
因为 Nginx 的文档大部分是俄文的,Nginx 的中文维基的目的是帮助使用中文世界的用户安装、配置和交换有关 Nginx 的使用经验。大部分文档源自Aleksandar Lazic <al-nginx AT none DOT at>的工作。有关本维基本身的问题请直接询问Cliff Wells <cliff AT develix DOT com>。

Nginx 的中文维基:http://wiki.codemongers.com/NginxChs
Nginx 的中文站: http://www.nginx.cn

nginx 跟lighttpd随时间的用户群比较:

posted @ 2008-07-18 12:59 小马歌 阅读(193) | 评论 (0)编辑 收藏
 

1.拳头之Get/Post
拳头是最基本的一重武器,也是最重要的,好比练武之人必须先扎稳马步。

java 代码

HttpClient httpclient=new HttpClient();//创建一个客户端,类似打开一个浏览器  
GetMethod getMethod=new GetMethod("http://www.blablabla.com");//创建一个get方法,类似在浏览器地址栏中输入一个地址  
int statusCode=httpclient.executeMethod(getMethod);//回车——出拳!  
System.out.println("response=" + getMethod.getResponseBodyAsString());//察看拳头命中情况,可以获得的东西还有很多,比如head, cookies等等  
getMethod.releaseConnection();//释放,记得收拳哦  


2.孔雀翎之支持https

如何支持https?

java 代码
 
static{  
    Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);  
    Protocol.registerProtocol("https", easyhttps);  
}  

在执行具体的http method之前,暗中将https协议注册一把,如孔雀翎暗藏玄机,毙敌于无形。记住,官方的binary发行版本没有ssl的contribute包,方法一是下载源代码版本来打造你的孔雀翎。

3.多情环之cookies
常道人老多情,其实是记忆太多,所以情之所至,正如cookies甜心,无论你走到那,总把你牵挂:

java 代码
 
HttpClient httpclient=new HttpClient();  
httpclient.getParams().setCookiePolicy(CookiePolicy.RFC_2109);//RFC_2109是支持较普遍的一个,还有其他cookie协议  
HttpState initialState = new HttpState();  
Cookie cookie=new Cookie();  
cookie.setDomain("www.balblabla.com");  
cookie.setPath("/");  
cookie.setName("多情环");  
cookie.setValue("多情即无情");  
initialState.addCookie(cookie);  
httpclient.setState(initialState);  
...  


4.离别钩之解构cookies
多情环的反面即离别钩,钩出,敌之身体某个部件即要与身体别离,端的是无情:

java 代码
 
...//执行了某些get/post方法后  
Cookie[] cookies = httpclient.getState().getCookies();  
System.out.println("Present cookies: ");  
for (int i = 0; i < cookies.length; i++) {//循环结构零部件  
    System.out.println(" - " + cookies[i].toExternalForm());  
    System.out.println(" - domain=" + cookies[i].getDomain());  
    System.out.println(" - path=" + cookies[i].getPath());  
    ...            
}  


5.霸王抢之post参数
枪,长兵器之王,诸多名将均使一杆或金或银命名的名枪,比如岳飞。post方法在提交参数对时,犹如灵蛇出洞:

java 代码
 
PostMethod postMethod = new PostMethod("http://www.saybot.com/postme");  
NameValuePair[] postData = new NameValuePair[2];  
postData[0] = new NameValuePair("武器", "枪");  
postData[1] = new NameValuePair("什么枪", "神枪");  
postMethod.addParameters(postData);  
...//出枪吧  


6.七星碧玉刀之支持代理(proxy)
代理,非常重要,尤其在局域网横行的年头,没有代理,你在公司上不了QQ,没有代理,google不了网页快照,代理之威,可比七星碧玉刀,无刀,在局域网和开发当中,一切白搭:

java 代码
 
HttpClient httpclient=new HttpClient();  
httpClient.getHostConfiguration().setProxy("192.168.0.1", 9527);  
httpClient.getParams().setAuthenticationPreemptive(true);//重要!!!告诉httpclient,使用抢先认证,否则你会收到“你没有资格”的恶果  
/* 
  这一步也至关重要,MyProxyCredentialsProvider实现了org.apache.commons.httpclient.auth.CredentialsProvider接口, 
  返回代理的credential(username/password)*/  
httpClient.getParams().setParameter(CredentialsProvider.PROVIDER, new MyProxyCredentialsProvider());  
httpClient.getState().setProxyCredentials(  
    new AuthScope("192.168.0.1",  
        AuthScope.ANY_PORT, //任意端口哦,可要小心  
        AuthScope.ANY_REALM),//任意域哦,可要小心  
new UsernamePasswordCredentials("username",//proxy的用户名  
                        "password"));//proxy的密码  

...

7.长生剑之天下第一
看httpclient的官方文档:jakarta.apache.org/commons/httpclient/userguide.html
看Hilton网友写的小葵花宝典笔记:www.cnjm.net/tech/article1155.html
通读后,你会有种拔剑四顾心茫然的高手感觉。

posted @ 2008-07-18 12:49 小马歌 阅读(1453) | 评论 (0)编辑 收藏
 

2005年,全球空气污染严重城市依次为:(中国)太原、米兰、(中国)北京、(中国)乌鲁木齐、墨西哥城、(中国)兰州、(中国)重庆、:中国)济南、(中国)石家庄、德黑兰全球污染严重的的二十城市, 中国竟然占了16 国内空气和其它污染日益严重

2006年,世界卫生组织(WHO)将印度首都新德里列为全球污染严重城市,其后是开罗、加尔各答和中国的天津。中国有16城市位列前20名。伦敦排在第91位。
  
  五年前,山西省下康村的一千名村民突然发现村里的水落石出变咸了。水壶在烧完水后变成了红色。“我开始拉肚子,病再没好过,”陈女士说,“我和邻居谈起这事,他们抱怨自己也一样。”几月后,她双腿瘫痪。现在她整天躺在木板床上。和许多村民一样,这位农妇患脑血栓,半身不遂。27名村民已经因此死亡,其中有一名14岁的女孩。
    这个村庄如一座疗养院。在村里的土路上,几乎所有人都拄着拐仗一瘸一拐地走路。尽管陈女士的丈夫也病了,他还是背着妻子去看病,他们买不起轮椅。
    “要是我知道水里有毒,我怎么也不会喝啊,”陈女士哭着说,“可没人告诉我们。”
    村民们常年饮用井水,尽管土壤已经被氯化物、硫酸钾和硝酸盐污染了。附近的钢铁厂和造纸厂把未经处理的废水排入汾河。近十年间,两家工厂的废水排放量增长了数倍。
    下康村这样的村庄在中国还有很多。比如淮河流域的黄孟营。流经此地的河水覆盖着白色的泡沫。附近的味精公司污染了河水。在过去十年里,2400名村民中的110人死于癌症。31岁的孔荷芹(音)亮出了医生在她肚脐旁做的人造肛门。身患肠癌和甲状腺癌的她在过去五年接受了四次手术和总计12疗程的化疗。
    “再也没钱看病了,现在我只有等死。”这位两孩子的母亲说。
    今年中国的经济增长率可能将达9%,出口也会大幅增加。“但这种奇怪不久就会结束,因为环境跟不上,”中国环保当局的一位负责人说,“我国最大的七条河流中的半数河水完全无法利用。四分之一的中国人得不到清洁的饮用水。”
    在中国,超过80%的垃圾和汗水得不到任何处理。每年有四十万中国人死于废气引发的疾病。全球空气污染严重的二十城市有16在中国,北京也位列其中,欧洲航天局通过卫星观测发现北京是全世界污染严重的首都之一。
    尽管北京将工厂迁出了市区,可越来越多的汽车在污染空气方面取而代之。而且工厂向张村迁移导致农村的污染愈发严重。投资者看上那里低廉的地价和更容易受贿的村官。与城市干部相比,他们对环境污染者更是睁一只眼闭一只眼。
    在中国北部的北山村,人的脸常常像煤一样黑。自2001年起,这一地区建起了百余家炼焦厂和冶金厂。他们不仅为国内市场,也为日本和韩国生产。当地居民称自己的家乡为“黑三角”。一根根烟囱冒出黑黄白各色的浓烟。刺鼻的臭气令人难以呼吸,双眼疼痛。
    山头的尸体在灰色的草地上腐烂。“工厂让草都中了邪”,蒙古族牧羊人庄龙海(音)说,“我的370只绵羊和山头在今年已经死了三十只。而且羊毛都是黑的!”
    姓杨的15岁少年戴着墨镜,用尼龙头巾裹住脸。他把石灰砸成小块,装进袋子,然后扛到一家炼焦厂。与牧羊人不同,他不抱怨空气污浊。“我习惯了,而且我在这儿挣得不错”,他说。他按袋子的数量领取薪水,每天能挣1.6欧元,要干十小时。上完小学二年级,杨就辍学了,他的父母付不起学费。
    中国为全世界提供产品,但本身从中获益并不多。有些地方的工作条件与其说是21世纪的,不如说是19世纪的。
    这位环保当局负责人说:“生产同样价值的产品,我们消耗的资源是日本的七倍、美国的近六倍、印度的近三倍。中国是世界工厂……但令我忧虑的是,中国正沦为地球的垃圾堆。”
    全球电脑的垃圾堆已经有了地址:离香港五小时车程的贵屿镇。在那里,十万人生活在用竹竿和草垫搭建的棚屋里。屋外堆积着IBM的电脑、惠普的传真机和博世公司的手机。这些电子垃圾是来自欧洲和美国的舶来品。那里到处散发着烧焦的电线和有毒酸液的气味。

posted @ 2008-07-16 00:37 小马歌 阅读(396) | 评论 (0)编辑 收藏
 
  • 美心星巴克咖啡(兴华路海上世界南山宾馆113号)
  • 临海阁咖啡西餐厅(上沙九园村1巷14号13楼)
  • 品尚品咖啡地带福华路店(福华路福侨大厦2楼(近福星路))
  • 骑士咖啡厅(嘉宾路4018号新时代酒店)
  • 南都咖啡西餐厅松柏路店(横岗镇松柏路18号)
  • 冰点咖啡厅(深圳市罗湖区人民南路联华大厦2605室)
  • 真锅咖啡馆(广东省深圳市宝安区西乡镇桃源居3区1栋2号)
  • 曼特林西餐咖啡厅(深圳市宝安区沙井镇新桥村北环路73号1楼)
  • 阳光咖啡分馆(广东省深圳市福田区振华路兰光大厦地面首层)
  • 嘉维咖啡厅(广东省深圳市南山区创业南路西海湾花园B区商铺56-57号)
  • 夜港咖啡厅(广东省深圳市南山区太子路海上世界广场36-37号)
  • 蓝鸟咖啡西餐厅(广东省深圳市南山区近海路招商服务大厦一楼南侧)
  • 上岛咖啡科技店(广东省深圳市南山区高新科技园南区高新南一道国微大厦附楼)
  • 假日咖啡厅(广东省深圳市罗湖区东门北路1006号公路大厦首层)
  • 缘聚咖啡厅(深圳市福田区红荔路1号青少年宫大家乐健身房2楼)
  • 西雅图咖啡厅(深圳市南山缤纷假日豪园38号)
  • 乐美茄咖啡馆(广东省深圳市罗湖区深南东路5002号信广场商场323单元)
  • 雅兰德咖啡屋(广东省深圳市南山区南油大道缤纷假日豪园E座1层商铺128号)
  • 阿罗哈咖啡厅(深圳市福田区华强南路赛格苑一楼3016B)
  • 名典咖啡语茶(天安店)(深圳市福田区天安数码城创新科技广场B座二楼)
  • 名典咖啡语茶(福星路店)(福田区福星路102号1-2楼)
  • 名典咖啡语茶(华强店)(福田区福强路南光名仕苑富仕阁1楼)
  • 名典咖啡语茶(福源大厦店)(福田区彩田南路福源大厦2楼)
  • 名典咖啡语茶(红荔西路店)(福田区红荔西路现代演艺中心2楼)
  • 名典咖啡语茶(梅林店)(福田区梅林一村5区)
  • 名典咖啡语茶(特报店)(福田区新洲路特报社公寓大楼1楼)
  • 名典咖啡语茶(茂源大厦店)(罗湖区宝安南路茂源大厦2楼)
  • 名典咖啡语茶(凤凰路店)(罗湖区凤凰路11号柏豪酒店1楼)
  • 名典咖啡语茶(和平广场店)(罗湖区和平广场3楼)
  • 名典咖啡语茶(富苑店)(罗湖区南湖路粤海花园1楼)
  • 美心星巴克咖啡餐饮(广东省深圳市福田区振华路45-1号富怡雅居首层)
  • 美心星巴克咖啡餐饮(广东省深圳市福田区振华路45-1号富怡雅居首层)
  • 名典咖啡语茶(南山店)(南山区创业路90号怡海广场西座)
  • 名典咖啡语茶(蛇口店)(南山区蛇口太子路59号)
  • 名典咖啡语茶(正大大厦店)(宝安区46区翻身路正大大厦123号)
  • 名典咖啡语茶(西湖苑店)(龙岗区坪地镇教育中路西湖苑商铺1、2楼)
  • 美心星巴克咖啡餐饮城市广场分店(深南中路深圳市城市广场首层1002号)
  • 悠馨苑咖啡语茶(深圳市福田区莲花路万科金色家园一期裙楼102号)
  • 意天利极品咖啡馆(深圳市罗湖区深南东路地王大厦信兴广场南门旁)
  • 摩天楼咖啡会所(广东省深圳市南山区蛇口太子路18号海景广场20E)
  • 名香咖啡西餐吧(深圳市福虹路世贸商城二楼南侧(294#-2106#商铺))
  • 马沙拉咖啡厅(广东省深圳市南山区蛇口工业区太子路海上世界广场34号商铺)
  • 玮霖咖啡(华侨城店)(深圳市南山区华侨城中旅广场、华侨城铜锣湾广场二层L01)
  • 玮霖咖啡(蛇口店)(深圳市南山区蛇口海上世界太子路口南山宾馆105、106号)
  • 红靴子咖啡厅(深圳市南山区蛇口海滨花园商业中心A座1楼)
  • 汤美咖啡(南中店)(深圳市福田区深南中路2号新闻大厦1号楼103号)
  • 汤美咖啡(深圳市南山区世界之窗景区前广场咖啡厅)
  • 汤美咖啡(深南东店)(深圳市福田区振华大厦首层西侧)
  • 汤美咖啡(彩田店)(深圳市福田区彩田南路3010号彩天名苑裙楼首层101室)
  • 汤美咖啡(东门店)(深圳市福田区人民北路西解放路北名仕商城二栋首层)
  • 玫瑰园咖啡厅(广东省深圳市罗湖区东门南路华都园大厦17楼G、H室)
  • 丘比特咖啡厅(广东省深圳市罗湖区东门南路3002号华都园大厦21楼G室)
  • 光明浓情咖啡(深圳市宝安区光明滨河苑4栋首层)
  • 丹尼斯西餐咖啡厅(深圳市罗湖区深南东路3039号深房百货二楼)
  • 爱侬咖啡(南山区后海大道招商名仕铺)
  • 扎瓦咖啡(南山区创业路西海湾花园56、57号商铺)
  • 盛唐咖啡(南山区南光路鸿瑞花园首层19号商铺)
  • 老树咖啡(罗湖区店)(罗湖区人民南路深房广场首层北侧)
  • 老树咖啡(湾畔店)(福田区白石洲中海深圳市湾畔花园右侧裙楼2楼)
  • 老树咖啡(南新店)(南山区南新路向南西海花园E栋2楼)
  • 老树咖啡(科技园店)(南山区科技园深南花园2楼)
  • 布莱梅之家(深圳市福田区振兴路205栋102)
  • 布莱梅之家(深圳市福田区振兴路205栋102)
  • 蓝调咖啡(深圳市福田区红荔路1007号)
  • 那由他咖啡西餐厅CAFE NAYOOTA(深圳市华强南路上步商业大厦首层)
  • 拿波里咖啡馆(振兴路2号上步工贸大厦一楼)
  • 西雅图西餐咖啡厅(0755-82340033)
  • 天鹅堡咖啡厅(福田区燕南路96号格林酒店2楼)
  • 西城西餐咖啡厅(福田区八卦二路上林苑酒店东侧)
  • 伊甸园西餐咖啡厅(罗湖区深南东路3039号)
  • 冰工场(红桂店)(罗湖区红桂路2100号)
  • ILLY咖啡 ITA COFFEE(福田区中信城市广场国际休闲酒吧街A3栋(肯德基西侧))
  • 咖啡时间(CAFE TIME)(南山区蛇口海上世界广场E区62号)
  • 中世纪咖啡西餐厅(罗湖区宝安南路1050号湖北宝丰大厦首层)
  • 那堤咖啡西餐厅(天安数码城店)(福田区天安数码城创新科技广场B座2楼212)
  • Mercents Coffee(福田区深南中路电子科技大厦A座首层)
  • TTs Coffee(世界之窗店)(南山区华侨城世界之窗前广场)
  • TTs Coffee(创展店)(福田区安徽大厦创展中心)
  • TTs Coffee(新闻大厦店)(福田区深南中路2号新闻大厦首层)
  • TTs Coffee(振华大厦店)(罗湖区深南东路2102号振华大厦首层西侧101#铺)
  • TTs Coffee(彩田南路店)(福田区彩田南路彩天名苑富岛家居首层西侧101#铺)
  • 星巴克(设计大厦店) STARBUCKS(福田区笋岗西路3001号市政设计大厦内)
  • 星巴克(中信广场店) STARBUCKS(福田区深南中路中信广场首层)
  • 品尚品咖啡(新洲店)(福田区新洲路中电信息大厦4楼)
  • 南都咖啡西餐厅(吉厦村店)(龙岗区布吉镇吉厦村沙平南路82号)
  • 南都咖啡西餐厅(金鹏路店)(龙岗区布吉镇金鹏路13号2楼)
  • 南都咖啡西餐厅(莲花路店)(龙岗区布吉镇莲花路38号)
  • 南都咖啡西餐厅(六约店)(龙岗区横岗镇深惠路六约段446号)
  • 南都咖啡西餐厅(松柏路店)(龙岗区横岗镇松柏路18号)
  • 南都咖啡西餐厅(龙城店)(龙岗区龙岗镇深惠路622号)
  • 南都咖啡西餐厅(怡兴店)(龙岗区坪山镇立新西路18号)
  • 绿茵阁咖啡厅(春风店)(罗湖区东门南路1031号)
  • 星巴克(佳宁娜店)(罗湖区人民南路佳宁娜广场内)
  • 星巴克(佳宁娜店)(罗湖区人民南路佳宁娜广场内)
  • 上岛咖啡(福华店)(福田区福华路146号)
  • 上岛咖啡(中深店)(福田区红岭中路中深国际大厦2楼)
  • 上岛咖啡(景田东路店)(福田区景田东路32号)
  • 上岛咖啡(华侨城店)(南山区华侨城美加广场A-101商铺(近欢乐谷))
  • 上岛咖啡(南山店)(南山区南山大道桃苑内)
  • 上岛咖啡(蛇口店)(南山区蛇口内环路4号世纪广场南座1楼)
  • 毕加索咖啡屋(龙岗镇深惠公路旁美洲大厦首层)
  • 咖啡时间(太子路海上世界广场E62铺)
  • 西堤岛咖啡华侨城店(华侨城波托菲诺纯水岸商业街)
  • 空中咖啡厅(东滨路文化广场4楼)
  • 三智老树咖啡(东环一路金城大厦)
  • 西部牛仔咖啡厅(登良路99号惠中名苑B02商铺)
  • 慧蓉西餐咖啡厅(滨河大道5022号联合广场B座首层)
  • 典之最咖啡店(创业路90号怡海广场)
  • 意天利咖啡东湖店(太宁路东湖吉之岛L1-01铺)
  • 上岛咖啡(宝民一路店)(宝安区7区宝民一路394号)
  • 仙踪林(振兴店)(福田区振兴路15号)
  • 耶士咖啡(保利店)(南山区南油大道创业路口保利大厦大堂)
  • 耶士咖啡(蛇口店)(南山区蛇口鸿隆公寓一楼110、111号)
  • 卡碧桃咖啡吧(东海花园店)(福田区农科中心香軒路東海坊東海花园G33B、35、36、38号)
  • 耶仕咖啡(景田店)(福田区景田北路77号擎天大厦一楼)
  • 寻蝶坊咖啡厅(罗湖区深南东路5001号华润大厦万象城一层)
  • 爱琴海咖啡厅(福田区深南中路水务集团万德大厦二楼)
  • 澳洲星迪咖啡(景田店)(福田区红荔西路第一世界广场岁宝明星店首层)
  • 澳洲星迪咖啡(华侨城店)(南山区华侨城铜锣湾广场)
  • 摩得咖啡(福田区中心区民田路新华保险大厦1楼106号)
  • 润石咖啡茶语(福田区百花二路百花公寓3栋工商银行二楼)
  • 名典咖啡语茶(坂田店)(布吉镇坂田五和大道17区25栋)
  • 名典咖啡语茶(华侨城店)(华侨城西街OCT生态广场A区201号)
  • 名典咖啡语茶(鸿瑞店)(南光路鸿瑞花园三期20-21号)
  • 名典咖啡语茶(鸿瑞店)(南光路鸿瑞花园三期20-21号)
  • 品尚品咖啡(福侨店)(深圳市福田区福侨大厦二楼)
  • 品尚品咖啡(宝安店)(深圳市宝安区宝安三区建安一路29号2楼)
  • 品尚品咖啡(金花街店)(深圳市罗湖区金华街13号)
  • 品尚品咖啡(瑞和园店)(深圳市福田区益田路(福民路口))
  • 品尚品咖啡(铜锣湾店)(深圳市福田区华强北路1号铜锣湾广场C座2楼)
  • 品尚品咖啡(福华路店)(深圳市福田区福华路福侨大厦2楼)
  • 品尚品咖啡地带(翠竹店)(深圳市罗湖区翠竹路逸翠阁2期2层201号商铺)
  • 品尚品咖啡厅(深圳市南山区蛇口工业区太子路32号二楼)
  • 那堤咖啡厅(福田区车公庙天安数码城创新科技广场B座2楼)
  • 域咖咖啡坊(深圳市罗湖区蔡屋围松园北路鸿翔花园商铺1037-1038号)
  • 绿茵阁咖啡厅(深圳市福田区深南中路赤尾大厦二层)
  • 王朝咖啡(罗湖区爱国路1056号)
  • 茗香咖啡(钻石店)(罗湖区南湖路钻石广场3楼)
  • 上岛咖啡(宝丽店)(罗湖区宝安南路宝丽大厦一楼)
  • ILLY COFFEE(深圳市南山区华侨城)
  • 米萝咖啡宝安鸿景园店(宝安宝民一路鸿景园)
  • 92℃咖啡馆(南园路72号(上步大厦旁))
  • 那由他咖啡西餐厅(上步商业大厦首层)
  • SPR COFFEE(侨城店)(深圳市华侨城波托菲诺会所商业小镇055号)
  • 沁香咖啡屋(罗湖区爱国路建国大厦一楼)
  • 雅典世家西餐咖啡厅(福田区东园路150号玉福楼首层)
  • 星巴克(茂业店)STARBUCKS(深圳市福田区华强北路2006号茂业百货首二层C01号铺)
  • 星巴克(万象城店)(罗湖区宝安南路华润中心万象城内)
  • ITALIAN BEST COFFEE意式咖啡馆(深圳市福田区中航苑航城大厦东座1楼(天虹商场背面))
  • 午后浓香咖啡馆(蛇口店)(南山区蛇口工业区太子路海上世界明华轮首层)
  • 午后浓香咖啡馆(嘉汇百货店)(福田区深南大道嘉汇百货1楼)
  • 星巴克STARBUCKS (海上世界店)(南山区蛇口海上世界)
  • 中电商务会所观景咖啡厅(深圳市深南中路电子科技大厦A座38楼(电梯至37楼,再上一层楼梯))
  • 午后浓香咖啡馆(华侨城店)(南山区华侨城OCT生态广场酒吧街A110)
  • 罗马之恋咖啡厅(南山区华侨城华夏艺术中心二楼)
  • 罗马之恋咖啡厅(南山区华侨城华夏艺术中心二楼)
  • 廊桥寻味(福田区上步南路1001号锦峰大厦一楼)
  • 皇室咖啡(购物公园北园A座313室)
  • 阳光英语咖啡屋()
  • 深圳市没有的咖啡(盐田)
  • 南都咖啡西餐厅怡兴店(坪山镇立新西路18号[深圳市])
  • 皇家咖啡馆(蔡屋围金塘街)
  • 好景豪园会所餐厅(福荣路好景豪园会所(近沙咀牌坊))
  • 南都咖啡西餐厅吉厦村店(布吉镇吉厦村沙平南路82号)
  • TTs Coffee振华大厦店(深南东路2102号振华大厦首层西侧101#铺)
  • TTs Coffee世界之窗店(华侨城世界之窗前广场)
  • 南都咖啡西餐厅六约店(横岗镇深惠路六约段446号)
  • 南都咖啡西餐厅莲花路店(布吉镇莲花路38号)
  • 真锅珈琲馆清华店(前进路桃源居三区壹栋02)
  • TTs Coffee新闻大厦店(深南中路2号新闻大厦首层)
  • 名典咖啡语茶沙头角店(沙头角沙深路海滨花园)
  • 老树咖啡深房广场店(人民南路深房广场首层北侧)
  • 响99咖啡厅(西乡镇河西路2号)
  • 西堤岛咖啡财富广场店(深南大道财富广场B座127商铺)
  • 星期六咖啡厅(创业东路海岸明珠首层)
  • 真锅珈琲馆投资大厦店(深南大道4009号投资大厦大堂)
  • 品味咖啡(景田南路国泰豪园2楼)
  • 梦腾树咖啡(上步工业区501栋振兴宾馆首层)
  • 名雅咖啡经典(爱国路新丰大厦1楼)
  • 万家好咖啡经典(上步南路1067号)
  • 滨乐咖啡金光华店(人民南路2028号金光华广场L2-076号)
  • 左岸工作室(红荔路TCBY旁)
  • 伯朗咖啡(莲花路万科金色家园106号)
  • 好莉莱咖啡厅(南海大道海王大厦1楼中厅大堂)
  • 南油酒店咖啡厅(东滨路南油酒店内)
  • 卡地咖啡(前海路港湾丽都裙楼)
  • 卡地咖啡(前海路港湾丽都裙楼)
  • 绿茵苑咖啡厅(湖贝路1085号)
  • 香榭丽舍咖啡厅碧馨苑店(福民路碧馨苑首层)
  • 香典西餐咖啡语茶(文锦渡锦联路运通大楼2楼)
  • 滨乐咖啡宝丽店(宝安南路2052号宝丽大厦1楼)
  • 亚美茄咖啡馆(深南东路5002号地王大厦信兴广场3楼323)
  • 午后浓香咖啡馆嘉汇百货店(深南大道嘉汇百货1楼(近上海宾馆))
  • 非非想时尚发型·咖啡(宝安南路1881号万象城4楼422商铺)
  • 得意坊咖啡厅(蔡屋围新九坊38号)
  • 绿茗轩咖啡语茶(福中路17号人才大厦1楼)
  • 绿岛咖啡(人民南路2010号发展中心大厦1层)
  • 富苑酒店广场咖啡厅(南湖路3018号富苑酒店1楼)
  • 左岸咖啡(宝安35区上川路163号)
  • 美之庐空中御花园(春风路庐山大厦)
  • 雅嘉乐咖啡茶语车公庙店(车公庙)
  • 芗茗咖啡秀(振华路家乐大厦2楼)
  • 怡情咖啡店(布吉镇吉华路德兴城1楼)
  • 雅典咖啡店(华强北路南方大厦首层)
  • 凤凰咖啡厅(凤凰路179号)
  • 深南大道西餐咖啡(深南中路兴华宾馆侧爱华电脑大厦附楼2楼)
  • 缘聚咖啡语茶(红荔路1号青少年活动中心大家乐健美苑2楼)
  • 名艺咖啡语茶(振华路深纺大厦C座2楼)
  • 茗香咖啡精典横岗店(横岗镇四联路56号)
  • 彭年咖啡厅(嘉宾路2002号希尔顿彭年酒店2楼)
  • 意天利咖啡航城店(中航苑航城大厦1楼)
  • 茗香咖啡精典福虹店(福虹路世贸商城2楼南侧)
  • 西典咖啡艺茶(百草园商业街6号(近华润超市))
  • 心琴咖啡吧(红岭大厦云鹏酒店1楼)
  • 雅嘉乐咖啡茶语福星店(福星路福永楼2楼)
  • 茗香咖啡精典爱国路店(爱国路1052号A座新王朝酒店1楼)
  • 海韵咖啡厅(红荔路四川大厦首层)
  • 海韵咖啡厅(红荔路四川大厦首层)
  • 圣淘沙西餐咖啡厅(文锦路2号)
  • 阳光咖啡馆振华路店(振华路兰光大厦首层)
  • 茗香咖啡精典总店(翠竹路1056号逸翠园102号)
  • 意天利咖啡华侨城店(波托菲诺纯水岸商业街内)
  • 休闲小筑咖啡厅(红荔路上步工业区201幢109室)
  • TTs Coffee创展店(深南大道6007号安徽大厦创展中心)
  • 耶士咖啡海上世界店(太子路海上世界广场鸿隆公寓1楼商铺110号)
  • 耶士咖啡保利店(南海大道创业路口保利大厦大堂)
  • 香榭里咖啡名店(48区宝华花园A栋首层8号)
  • 艾凡里咖啡语茶(学府路138号)
  • 柠香草咖啡西餐吧(新洲路新洲北村31号)
  • 品尚品咖啡地带布吉信义店(布吉百鸽信义假日名城菁华园EF栋E座)
  • 名典咖啡语茶粤海店(深南东路3033号粤海酒店109号(2、10、29、223路))
  • 星巴克茂业店(华强北路2006号茂业百货首二层C01号铺)
  • Marine Coffee(太子路太子广场G13号商铺)
  • 星巴克设计大厦店(笋岗西路3001号市政设计大厦内)
  • 迪欧咖啡宝安总店(3区龙井路59号外贸大楼)
  • 星巴克万象城店(宝安南路1881号华润中心万象城B99号铺)
  • 星迪咖啡(华侨城铜锣湾广场2楼)
  • 西典咖啡艺茶红桂店(红桂大厦4楼)
  • 金地品尚品中西餐厅(金地四路112栋2层)
  • 品尚品咖啡地带铜锣湾店(华强北路1号铜锣湾广场C座2楼)
  • 香榭丽舍咖啡厅科技大厦总店(太宁路85号科技大厦首层)
  • 上岛咖啡蛇口店(东滨路4号世纪广场南座1楼)
  • 上岛咖啡福华店(福华路146号)
  • 午后浓香咖啡馆华侨城店(华侨城OCT生态广场酒吧街A110)
  • 耶士咖啡华侨城店(华侨城波托菲诺风情街55号)
  • 米萝咖啡东方店(107国道松岗段(東方大道))
  • 狮迈咖啡(蛇口工业七路(四海公园南门))
  • 星巴克蛇口店(南海大道蛇口花园城中心首层132号铺(沃尔玛对面))
  • 星巴克蛇口店(南海大道蛇口花园城中心首层132号铺(沃尔玛对面))
  • 名典咖啡语茶西湖苑店(坪地镇教育中路西湖苑商铺1、2楼)
  • 茗香咖啡精典峰景台店(怡景路11号峰景台地铺15号)
  • 耶士咖啡景田店(景田北路77号擎天大厦1楼)
  • KOSMO万象店(宝安南路1881号华润中心万象城首层)
  • 观星台咖啡厅中信广场店(深南中路1095号中信城市广场4楼412)
  • 甜心咖啡语茶(大学城西丽大街37-39号)
  • 观星台咖啡厅顺电家居店(华强北顺电家居广场五楼)
  • 麦咖啡(东门老街西华宫麦当劳2层)
  • 名典咖啡语茶茂源大厦店(宝安南路茂源大厦2楼)
  • 山脉咖啡厅(观澜镇高尔夫大道观澜球会内骏豪酒店)
  • 盛唐咖啡南山店(南光路鸿瑞花园正门口)
  • 蓝鸟咖啡机场店(深圳市国际机场安检内卫星厅国内出发6—11号登机口旁)
  • 钢琴吧(观澜镇高尔夫大道观澜球会内骏豪酒店)
  • 南都咖啡西餐厅龙城店(龙岗镇深惠路622号)
  • 名典咖啡语茶福源大厦店(彩田南路福源大厦2楼)
  • 品尚品咖啡地带翠竹店(翠竹路1058号翡翠星空大厦2楼)
  • 悟鱼咖啡(工业八路招商花园城三期3栋15号铺)
  • 星巴克铜锣湾店(华发北路1号铜锣湾广场A座底商)
  • 莱茵河咖啡(香梅路香逸名园首层)
  • 名典咖啡语茶凤凰路店(凤凰路11号柏豪酒店1楼)
  • 名典咖啡语茶振兴中路店(振兴中路73号)
  • 上岛咖啡华侨城店(华侨城美加广场A-101商铺(近欢乐谷))
  • 老树咖啡南新店(南新路向南西海花园E栋2楼)
  • KOSMO蛇口店(太子路海上世界广场115号南山宾馆1楼)
  • 迪欧咖啡(前进路冠利达大厦首层)
  • 星巴克机场店(深圳市国际机场B号候机楼1楼BS1-11号铺)
  • 上岛咖啡南山店(南山大道桃苑内)
  • 星巴克中信广场店(深南中路1095号中信城市广场1楼1002号铺)
  • 名典咖啡语茶蛇口店(蛇口太子路59号)
  • 名典咖啡语茶特报店(新洲路特报社公寓大楼1楼)
  • 名典咖啡语茶特报店(新洲路特报社公寓大楼1楼)
  • 蓝鸟咖啡蛇口店(近海路招商服务大厦旁(海月花园对面))
  • 名典咖啡语茶梅林店(梅林一村5区商业城210号)
  • 老树咖啡科技园店(科技园深南花园2楼)
  • 星巴克海上世界店(太子路海上世界广场南山宾馆113号铺)
  • 星巴克佳宁娜店(人民南路2002号佳宁娜广场1楼)
  • KOSMO中信店(深南中路1095号中信城市广场LG层111号)
  • 意天利咖啡地王一店(深南东路5002号地王大厦信兴广场南门两侧)
  • 米萝咖啡红荔店(红荔西路金色假日茗苑(景田南路口))
  • UCC COFFEE SHOP(解放路3034号湖北宾馆2楼)
  • 意天利咖啡万象城店(宝安南路1881号华润中心万象城地下1层)
  • 名典咖啡语茶和平广场店(和平广场3楼)
  • 澳洲星迪咖啡厅景田店(景田岁宝明星店西侧1楼)
  • 别克乔治(深南大道东座酒店首层)
  • 老树咖啡湾畔店(白石洲中海深圳市湾畔花园右侧裙楼2楼)
  • 名典咖啡语茶华强店(福强路南光名仕苑富仕阁1楼)
  • 悠馨苑(莲花路万科金色家园一期102号)
  • 十月咖啡馆(桃园路86号天虹商场2楼(近常兴路))
  • 大班咖啡(沙头角碧桐湾休闲中心2楼(近海关))
  • 名典咖啡语茶福星路店(福星路102号1-2楼)
  • 名典咖啡语茶红荔西路店(红荔西路现代演艺中心2楼)
  • 名典咖啡语茶富苑店(南湖路粤海花园1楼)
  • 风尚西餐厅(蛇口工业七路67号维园大厦1-2楼)
  • 盛唐咖啡宝安店(宝安4区前进一路御景台)
  • 星巴克购物公园店(福华三路星河苏活购物公园首层L1S-001号铺)
  • 蓝鸟咖啡科技园店(高新南十一路阳光带海滨城裙楼)
  • 茗香咖啡精典洪湖店(洪湖路北湖花园碧涛阁2楼C)
  • 海月咖啡厅(工业大道南山大厦107-109)
  • 上岛咖啡景田东路店(景田东路32号(财政局对面))
  • 澳洲星迪咖啡厅铜锣湾店(华侨城铜锣湾广场2楼)
  • 星巴克太阳广场店(解放路2001号太阳广场1-112A号铺)
  • 星巴克太阳广场店(解放路2001号太阳广场1-112A号铺)
  • 上岛咖啡宝民一路店(7区宝民一路394号)
  • 意天利咖啡茂业华强店(华强北路2006号茂业百货5楼)
  • 意天利咖啡地王二店(深南东路5002号地王大厦信兴广场414)
  • 品尚品咖啡地带瑞和园店(益田路瑞和园瑞馨阁(福民路口))
  • 乔治别克华强南路店(滨河大道华强南路口三九发展大厦2楼)
  • 上岛咖啡中深店(红岭中路中深国际大厦2楼)
  • 西典咖啡艺茶南山店(学府路康乐大厦)
  • 品尚品咖啡地带振华店(振华东路航天立业华庭二楼(近上步路燕南路))
  • ITA COFFEE(深南中路1095号中信城市广场酒吧街A3栋)
  • 休闲小居(凤凰路149号)
  • 乔治别克帝都店(红荔路7058号帝都酒店1楼)
  • 西典咖啡艺茶龙岗店(中心城碧湖花园首层)
  • 西典咖啡艺茶坂田店(布吉镇坂田)
  • 品尚品咖啡地带宝安店(宝安三区建安一路29号2楼)
  • 星巴克蛇口花园城店(南海大道蛇口花园城中心首层132号铺)
  • 茵欣咖啡厅(南海大道工业一路1号南海酒店1楼)
  • 尼斯咖啡厅(平湖街道办华南大道1号华丽城贵宾楼)
  • 金辉嘉柏酒店西餐厅(深南大道国际市长交流中心金辉嘉柏酒店1楼)
  • 夜港咖啡吧(太子路海上世界广场C36-C37铺)
  • 迪欧咖啡沙井店(沙井镇万丰村新沙路万丰酒店内)
  • 美丽华咖啡厅(蛇口港湾一路2号)
  • 长城大酒店咖啡厅(红桂路2086号长城大酒店内(近宝安南路))
  • 米萝咖啡丽景店(76区丽景城11栋101号)
  • 老树咖啡宝安店(宝安25区华丰广场1-2楼)
  • 迪欧咖啡福永店(福永镇龙翔北路1号)
  • 星巴克边检站店(罗湖区边检站内)
  • 品尚品咖啡地带湖贝店(湖贝路1017号1-2楼)
  • 迪欧咖啡前进路店(前进路冠利达大厦首层)
  • 乔治别克香蜜湖店(香蜜湖东座酒店首层(近深南大道))
  • 品尚品咖啡地带新洲店(新洲路中电信息大厦4楼)
  • 品尚品咖啡地带新洲店(新洲路中电信息大厦4楼)
  • 圣淘沙咖啡语茶(蛇口后海大道129-130号)
  • 星巴克金光华店(人民南路2028号金光华广场B1-106号铺)
  • 品尚品咖啡地带星河国际店(福华三路星河国际首层)
  • 地址:http://www.sz880.com/index.php?title=%E6%B7%B1%E5%9C%B3%E5%92%96%E5%95%A1%E5%8E%85%E5%88%97%E8%A1%A8

    其中 星巴克 深圳 52家:http://map.baidu.com/bendi/#word=%D0%C7%B0%CD%BF%CB+%C9%EE%DB%DA&ct=120&bs=020_10&rn=10&pn=0&&dbs=000

    posted @ 2008-07-07 14:47 小马歌 阅读(2603) | 评论 (0)编辑 收藏
     

    简单的可以这样:
    1,首先要打开core文件限制:ulimit -c unlimited
    2,gdb app corefile
    3,bt,显示堆栈信息


    有两个关于如何调试的详细页面:
    用GDB调试程序(zt) 
    http://www.linuxsir.org/bbs/showthread.php?t=171156
    http://www.trucy.org/blog/archives/eoiae/000087.html
    posted @ 2008-06-19 17:55 小马歌 阅读(305) | 评论 (0)编辑 收藏
     

    一、JSTL 简介
         JSTL是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。但是在即将推出的JSP 2.0中是作为标准支持的。
    JSTL包含两个部分:标签库和EL(Expression Language表达式语言)语言。
    JSP标准标记库(JSP Standard Tag Library,JSTL)是一个实现Web应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML操作以及数据库访问。
    JSTL 1.0 有四个定制标记库:core、format、xml 和 sql.
    1.core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。
    2.format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。
    3.xml 库包含一些标记,这些标记用来操作通过 XML 表示的数据。
    4.sql 库定义了用来查询关系数据库的操作。

    二、表达式语言(Expression Language)
    1.隐含对象(常用)
    1)requestScope:与请求作用域属性的名称和值相关联的 Map 类
    2)sessionScope:与会话作用域属性的名称和值相关联的 Map 类  
    3)applicationScope:与应用程序作用域属性名称和值相关联的 Map 类
    4)pageScope:与页面作用域属性的名称和值相关联的 Map 类
    5)param:按名称存储请求参数的主要值的 Map 类
    6)paramValues:请求参数的所有值作为 String 数组存储的 Map 类
    2.EL 表达式的格式:
    用美元符号($)定界,内容包括在花括号({})中,eg:${value}
    3.EL的存取器:使用点运算符(.)和方括号运算符([]).
    1)点运算符通常用于访问对象的特性。例如,在表达式 ${user.firstName} 中,使用点运算符来访问 user 标识符所引用对象的名为 firstName 的特性。
    2)方括号运算符用来检索数组和集合的元素。在数组和有序集合的情况下,把要检索的元素的下标放在方括号中。对于实现 java.util.Map 接口的集合,方括号运算符使用关联的键查找存储在映射中的值。在方括号中指定键,并将相应的值作为表达式的值返回。
    3)点运算符和方括号运算符可能实现某种程度的互换
    4.EL运算符
    1)算术运算符: +、-、*、/(或 div)和 %(或 mod)
    2)关系运算符: ==(或 eq)、!=(或 ne)、<(或 lt)、>(或 gt)、<=(或 le)和 >=(或 ge)
    3)逻辑运算符: &&(或 and)、||(或 or)和 !(或 not)
    4)验证运算符: empty
    三、常用的JSTL core tag
    1.set定义变量标记:定义限制了作用域的变量
    Syntax:
    1):<c:set value=”value” var=”varName” [scope=”{page|request|session|application}”]/>
    2):<c:set var=”varName” [scope=”{page|request|session|application}”]> body content   </c:set>
    2.out打印标记:显示表达式的值,取代jsp scriptlet中的<%=variableName%>
    Syntax:
    1):<c:out value=”${variableNam}” [escapeXml=”{true|false}”]> default value </c:out>
    2):<c:out value=”value” escapeXml=”{true|false}”] [default=”defaultValue”] />
    3.forEach循环标记(for/while):提供指定的循环次数(适用syntax 2)或在某个数据结构(Collection/Array)(适用syntax 1)上进行循环的能力
    Syntax:
    1):<c:forEach [var=”varName”]   items=”collection”   [varStatus=”varStatusName”]    [begin=”begin”]   [end=”end”]   [step=”step”] > body content </c:forEach>
    2):<c:forEach   [var=”varName”]   [varStatus=”varStatusName”] begin=”begin”   end=”end”   [step=”step”]> body content</c:forEach>
    4.forTokens循环标记:允许对一个String值进行循环,使用所选择的字符作为记号(token)之间的定界符
    Syntax:
    <c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> body content </c:forTokens >
    5.if条件求值标记(if):只在指定的测试条件为真时求具体的值,没有”else”条件—要么执行要么忽略执行体
    Syntax:
    1):<c:if test=”testCondition” var=”varName” [scope=”{page|request|session|application}”]/>
    2):<c:if test=”testCondition” [var=”varName”] [scope=”{page|request|session|application}”]>body content</c:if>
    6.choose条件求值标记(switch-case/if-else):使用嵌套when标记(类似case)和otherwise标记(可选,类似default)
    Syntax:
    1):<c:choose> body content (<when> and <otherwise> subtags)</c:choose>
    2):<c:when test=”testCondition”>body content</c:when>
    3):<c:otherwise> conditional block</c:otherwise>
    7.remove 删除变量标记:用来删除限制了作用域的变量的
    Syntax:
    <c:remove var=”varName” [scope=”{page|request|session|application}”]/>
    四、开始使用JSTL
    1.必需的文件:
    1)jar档:jstl.jar,standard.jar.一般是放置在lib目录下
    2)tld文件:c.tld,一般会是在WEB-INF目录下,依tld文件的位置修改web.xml文档
    3)一个web.xml的例子:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
       <taglib>
         <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
         <taglib-location>/WEB-INF/c.tld</taglib-location>
       </taglib>   
    </web-app>
    2.在JSP页面中声明标记库:
    <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
    五、参考资料
    JSTL规范:http://java.sun.com/products/jsp/jstl/index.jsp
    JSTL 1.0相关下载:http://www.apache.org/dist/jakarta/taglibs/standard-1.0/
    JSTL1.0规范书:http://www.jcp.org/aboutJava/communityprocess/first/jsr052/index.html
    表达式语言:http://www-900.ibm.com/developerWorks/cn/java/j-jstl0211/

    posted @ 2008-06-16 16:37 小马歌 阅读(2919) | 评论 (0)编辑 收藏
    仅列出标题
    共95页: First 上一页 84 85 86 87 88 89 90 91 92 下一页 Last