2008-10-27

说说多种字符编码的统一处理

  学校目前有几台阵列,几台linux服务器,几台windows服务器,还有一台FreeBSD服务器,各种服务器之间存储文件使用的编码是不一样的,而且这些服务器上挂的不同站点使用的字符编码也是不一样的。早期没有按照统一的标准制作,结果现在酿下的苦果就是我们这些继承人在处理问题的时候常常被编码问题所困扰。也许你也遇到了这种情况。最近正好搜了一些资料。了解了一些东西。共享出来。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
预备知识:

  1. 字符集和编码
  2.   在Linux上经常使用的字符集是ISO 8859系列的字符集.它包含了10个 多语言的单字节编码字符集.它们分别是,

    字符集 涵盖语言
    ISO 8859-1(Latin1) 拉丁一字符集, 包含绝大多数的欧洲语言, 例如French(fr), Spanish (es), Catalan (ca), Basque (eu), Portuguese (pt), Italian (it), Albanian (sq), Rhaeto-Romanic (rm), Dutch (nl), German (de), Danish (da), Swedish (sv), Norwegian (no), Finnish (fi), Faroese (fo), Icelandic (is), Irish (ga), Scottish (gd), English (en), Afrikaans (af) 和 Swahili (sw).影响了美洲, 澳洲和非洲.
    ISO 8859-2(Latin2) 拉丁二字符集, 包含了中欧和东欧的语言:Czech (cs), Hungarian (hu), Polish (pl), Romanian (ro), Croatian (hr), Slovak (sk), Slovenian (sl), Sorbian.
    ISO 8859-3(Latin3) 拉丁三字符集, 包括: Esperanto (eo) and Maltese (mt)
    ISO 8859-4(Latin4) 拉丁四字符集, 包括: Estonian (et), 巴尔地克 Latvian (lv) 和 Lithuanian (lt), Greenlandic (kl) , Lappish.
    ISO 8859-5(西里尔语) Bulgarian (bg), Byelorussian (be), Macedonian (mk), Russian (ru), Serbian (sr)
    ISO 8859-6(阿拉伯语) 阿拉伯语(ar)
    ISO 8859-7(希腊语) 希腊语(el)
    ISO 8859-8(希伯来语) Hebrew (iw) 和Yiddish (ji)
    ISO 8859-9(Latin5) 重排了Latin1, 用土耳其语的几个字母做了替换
    ISO 8859-9(Latin6) 重排了Latin4, 去掉了某些符号, 增加了Inuit等
    ISO 8859-11(泰国语) 泰国语(th)
    ISO 8859-12 Celtic
    ISO 8859-13(Latin7) Baltic Rim 和 Lativian(lv)
    ISO 8859-14(Latin8) Gaelic 和 Welsh (cy)
    ISO 8859-15(Latin9) Latin1的变种, 修改了某些字母

      双字节字符集主要包含中文,日文和韩文.它由前导字节(Lead Byte) 和尾部字节(Trail Byte)构成, 由于一个字符采用了两个字节, 在软件的 国际化方面又增加了一些麻烦, 比如在显示上, 光标的位置不能位于汉字 之间, 删除和移动时必须是整字操作等, 在输入上, 一般需要预编辑服务器 才能输入汉字. 下表列出了中日韩语言编码的有关信息:

    语言 字符集 代码页 前导字节范围 尾部字节范围
    简体中文 GB2312-1980 CP936 0xA1-0xF7 0xA1-0xFE
    GBK 0x81-0xFE 0x40-0x7E, 0x80-0xFE
    中文繁体 BIG-5 CP950 0x81-0xFE 0x40-0x7E, 0xA1-0xFE
    日文 Shift-JIS CP932 0x81-0x9F, 0xE0-0xFC 0x40-0xFC(0x7F除外)
    韩文 KSC-5601-1987 CP949 0x81-0xFE 0x41-0x5A,0x61-0x7A,0x81-0xFE
    KSC-5601-1992 CP1361 0x84-0xD3
    0xD8
    0xD90-0xDE
    0xE0-0xF9
    0x41,0xFE
    0x41-0x7E
    0x81-0xFE
    0x31-0x7E

      信息产业部和国家质量技术监督局联合制定了两项中文信息处理基础性国家标准,为解决偏、生汉字的输入提供了方案。其中GB18030- 2000《信息技术和信息交换用汉字编码字符集、基本集的扩充》,为强制性 国家标准.它收录了2.7万多个汉字,总编码空间超过150万个码位,为彻底 解决邮政、户政、金融、 地理信息系统等迫切需要的人名、地名用字问题 提供了解决方案,也为汉字研究、古籍整理等领域提供了统一的信息平台基础。 这项标准还同时收录了藏文、蒙文、维吾尔文等主要的少数民族文字.字符 集编码范围是:

    字节数 编码空间 码位数目
    单字节 0x00-0x80 129
    双字节 第一字节:0x81-0xFE
    第二字节:0x40-0x7E,0x80-0xFE
    23940
    四字节 四字节范围分别是:
    0x80-0xFE,0x30-0x39,0x81-0xFE,0x30-0x39
    1587600

      香港特别行政区也对Big5编码提出了"香港增补字符集", 其目的,是 收纳香港特区政府及市民在中文电子通讯中有需要使用的字符,来补充目前 大五码和ISO10646编码标准内并未包含的字符,以作为一个通用的中文界面, 方便大家能准确地以中文进行电子通讯。香港增补字符集有两套编码方案, 一套适用於大五码系统,另一套适用於ISO10646平台。香港增补字符集的大 五码版本,实际上是政府通用字库的增订版。ISO10646国际编码标准目前并 未包含香港增补字符集内的所有字符。目前尚未收纳在ISO10646内的香港增 补字符集字符,均已提交国际标准化组织管辖下的表意文字小组,以考虑是 否纳入ISO10646日后的新增版本内.

  3. 多字节字符(Multibyte)和宽字符(WideChar)的使用
  4.   我们平时见到的以文本方式存在的字符都是多字节字符, 它主要用于文件存储和网络上的以流(Stream)的方式传输.一个GB编码的汉字需要两个字节.多字节字符的缺点是在中文处理上不方便, 比如汉字的删除和光标的移动都会有半汉字问题.为了文本处理的方便,在内部操作上通常是把汉字 与英文的混和字符串先转换成等宽度的字符串, 即宽字符,为软件的内部处理 提供方便.

     glibc2.1.x中多字节字符串和宽字符串的转换有时有问题.在X下还可以 使用另外一种方式完成转换, 即使用XmbTextListToTextProperty()和 XwcTextPropertyToTextList() 联合完成转换.

  5. Unicode
  6.   目前所使用的Unicode 是一种16位字宽的字符编码, 它由非赢利的计算机 组织Unicode研讨会维护和改进.它起源于Xerox和Apple之间的合作研究.几 个公司组成了一个非正式的论坛, 接着IBM, Microsoft等公司迅速加入. Unicode研讨会在1990年发表了Unicode标准版本1, 同时国际标准化组织完成 了一种类似的编码----ISO 10646.因为没有必要存在两套标准, 所以Unicode 研讨会和国际标准化组织在1991到1992合二为一. 1994年, 中国和日本开始了基于ISO10646上的国家标准进行工作.现在, Unicode 开始用在许多产品中.

      Unicode包含了当今计算机领域中广泛使用的所由字符, 如世界上大部分 的书面语言, 印刷字符, 数字和技术符号, 地理图形和标点符号.由于Unicode 的一致性, 它在大多数情况下都可能简化软件的国际化过程.它取消了处理多种代码页的必要, 并且由于是16位编码, 因此由双字节字符集所引起的额外处理也不必要了.

      但是, Unicode作为一种编码也有它的缺陷, 比如编码的位置与排序无关, 所以使软件支持Unicode仅仅是国际化的第一步, 实际情况中还需要与语言相关的信息和规则.所以Unicode一般作为程序的内部处理编码, 必须提供与其它编码的双向转换表.

      最后需要说明的是,虽然使用Unicode会使普通的英文文本大两倍, 但是使用Unicode的整个系统却不会增加太大,因为系统存放的文件大部分是二进制文件格式, 同时, 使用针对Unicode的压缩方式,可以把文件压缩成和使用对应的8位正文一样大小。

-----------------------------------------------------------------------------  

UCS 和 ISO 10646?

国际标准 ISO 10646 定义了 通用字符集 (Universal Character Set, UCS). UCS 是所有其他字符集标准的一个超集. 它保证与其他字符集是双向兼容的. 就是说, 如果你将任何文本字符串翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何信息.

UCS 包含了用于表达所有已知语言的字符. 不仅包括拉丁语,希腊语, 斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语和乔治亚语的描述, 还包括中文, 日文和韩文这样的象形文字, 以及 平假名, 片假名, 孟加拉语, 旁遮普语果鲁穆奇字符(Gurmukhi), 泰米尔语, 印.埃纳德语(Kannada), Malayalam, 泰国语, 老挝语, 汉语拼音(Bopomofo), Hangul, Devangari, Gujarati, Oriya, Telugu 以及其他数也数不清的语. 对于还没有加入的语言, 由于正在研究怎样在计算机中最好地编码它们, 因而最终它们都将被加入. 这些语言包括 Tibetian, 高棉语, Runic(古代北欧文字), 埃塞俄比亚语, 其他象形文字, 以及各种各样的印-欧语系的语言, 还包括挑选出来的艺术语言比如 Tengwar, Cirth 和 克林贡语(Klingon). UCS 还包括大量的图形的, 印刷用的, 数学用的和科学用的符号, 包括所有由 TeX, Postscript, MS-DOS,MS-Windows, Macintosh, OCR 字体, 以及许多其他字处理和出版系统提供的字符.

ISO 10646 定义了一个 31 位的字符集. 然而, 在这巨大的编码空间中, 迄今为止只分配了前 65534 个码位 (0x0000 到 0xFFFD). 这个 UCS 的 16位子集称为 基本多语言面 (Basic Multilingual Plane, BMP). 将被编码在 16 位 BMP 以外的字符都属于非常特殊的字符(比如象形文字), 且只有专家在历史和科学领域里才会用到它们. 按当前的计划, 将来也许再也不会有字符被分配到从 0x000000 到 0x10FFFF 这个覆盖了超过 100 万个潜在的未来字符的 21 位的编码空间以外去了. ISO 10646-1 标准第一次发表于 1993 年, 定义了字符集与 BMP 中内容的架构. 定义 BMP 以外的字符编码的第二部分 ISO 10646-2 正在准备中, 但也许要过好几年才能完成. 新的字符仍源源不断地加入到 BMP 中, 但已经存在的字符是稳定的且不会再改变了.

UCS 不仅给每个字符分配一个代码, 而且赋予了一个正式的名字. 表示一个 UCS 或 Unicode 值的十六进制数, 通常在前面加上 "U+", 就象 U+0041 代表字符"拉丁大写字母A". UCS 字符 U+0000 到 U+007F 与 US-ASCII(ISO 646) 是一致的, U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是一致的. 从 U+E000 到 U+F8FF, 已经 BMP 以外的大范围的编码是为私用保留的.

什么是 Unicode?

历史上, 有两个独立的, 创立单一字符集的尝试. 一个是国际标准化组织(ISO)的 ISO 10646 项目, 另一个是由(一开始大多是美国的)多语言软件制造商组成的协会组织的 Unicode 项目. 幸运的是, 1991年前后, 两个项目的参与者都认识到, 世界不需要两个不同的单一字符集. 它们合并双方的工作成果, 并为创立一个单一编码表而协同工作. 两个项目仍都存在并独立地公布各自的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展.

那么 Unicode 和 ISO 10646 不同在什么地方?

  Unicode 协会公布的 Unicode 标准 严密地包含了 ISO 10646-1 实现级别3的基本多语言面. 在两个标准里所有的字符都在相同的位置并且有相同的名字.

  Unicode 标准额外定义了许多与字符有关的语义符号学, 一般而言是对于实现高质量的印刷出版系统的更好的参考. Unicode 详细说明了绘制某些语言(比如阿拉伯语)表达形式的算法, 处理双向文字(比如拉丁与希伯来文混合文字)的算法和排序与字符串比较所需的算法, 以及其他许多东西.

  另一方面, ISO 10646 标准, 就象广为人知的 ISO 8859 标准一样, 只不过是一个简单的字符集表. 它指定了一些与标准有关的术语, 定义了一些编码的别名, 并包括了规范说明, 指定了怎样使用 UCS 连接其他 ISO 标准的实现, 比如 ISO 6429 和 ISO 2022. 还有一些与 ISO 紧密相关的, 比如 ISO 14651 是关于 UCS 字符串排序的.

  考虑到 Unicode 标准有一个易记的名字, 且在任何好的书店里的 Addison-Wesley 里有, 只花费 ISO 版本的一小部分, 且包括更多的辅助信息, 因而它成为使用广泛得多的参考也就不足为奇了. 然而, 一般认为, 用于打印 ISO 10646-1 标准的字体在某些方面的质量要高于用于打印 Unicode 2.0的. 专业字体设计者总是被建议说要两个标准都实现, 但一些提供的样例字形有显著的区别. ISO 10646-1 标准同样使用四种不同的风格变体来显示表意文字如中文, 日文和韩文 (CJK), 而 Unicode 2.0 的表里只有中文的变体. 这导致了普遍的认为 Unicode 对日本用户来说是不可接收的传说, 尽管是错误的.

什么是 UTF-8?

首先 UCS 和 Unicode 只是分配整数给字符的编码表. 现在存在好几种将一串字符表示为一串字节的方法. 最显而易见的两种方法是将 Unicode 文本存储为 2 个 或 4 个字节序列的串. 这两种方法的正式名称分别为 UCS-2 和 UCS-4. 除非另外指定, 否则大多数的字节都是这样的(Bigendian convention). 将一个 ASCII 或 Latin-1 的文件转换成 UCS-2 只需简单地在每个 ASCII 字节前插入 0x00. 如果要转换成 UCS-4, 则必须在每个 ASCII 字节前插入三个 0x00.

在 Unix 下使用 UCS-2 (或 UCS-4) 会导致非常严重的问题. 用这些编码的字符串会包含一些特殊的字符, 比如 '\0' 或 '/', 它们在 文件名和其他 C 库函数参数里都有特别的含义. 另外, 大多数使用 ASCII 文件的 UNIX 下的工具, 如果不进行重大修改是无法读取 16 位的字符的. 基于这些原因, 在文件名, 文本文件, 环境变量等地方, UCS-2 不适合作为 Unicode 的外部编码.

在 ISO 10646-1 Annex R 和 RFC 2279 里定义的 UTF-8 编码没有这些问题. 它是在 Unix 风格的操作系统下使用 Unicode 的明显的方法.

UTF-8 有一下特性:

  • UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的.
  • 所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分.
  • 表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节. 多字节串的其余字节都在 0x80 到 0xBF 范围里. 这使得重新同步非常容易, 并使编码无国界, 且很少受丢失字节的影响.
  • 可以编入所有可能的 231个 UCS 代码
  • UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长.
  • Bigendian UCS-4 字节串的排列顺序是预定的.
  • 字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到.

下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode 中的序号.

U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具有越少的特殊意义. 只用最短的那个足够表达一个字符编码数的多字节串. 注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目.

例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为:

11000010 10101001 = 0xC2 0xA9

而字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:

11100010 10001001 10100000 = 0xE2 0x89 0xA0

这种编码的官方名字拼写为 UTF-8, 其中 UTF 代表 UCS Transformation Format. 请勿在任何文档中用其他名字 (比如 utf8 或 UTF_8) 来表示 UTF-8, 当然除非你指的是一个变量名而不是这种编码本身.

//你看不懂这一段的话请看utf-8官方解释:

What is UTF-8?

UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.

UTF-8 encodes each Unicode character as a variable number of 1 to 4 octets, where the number of octets depends on the integer value assigned to the Unicode character. It is an efficient encoding of Unicode documents that use mostly US-ASCII characters because it represents each character in the range U+0000 through U+007F as a single octet. UTF-8 is the default encoding for XML.

所以,其实说白了。unicode仅仅是表示了字符的编码表,但是没有指定如何编码,而UTF-8是一种unicode的八字节编码格式。


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

好了,有了预备知识之后,就可以去了解如何解决这种问题了。给了我最大启发的就是下面这两篇文章了:


  设想一下如何设计一个全球的论坛系统:可以让中文和日文的用户都可以方便的浏览发表呢?在数据中间处理阶段应该以那种字符集存储呢?答案很简 单:UniCode。以前很多文章都有关于如何设计一个国际化界面的介绍,只是应用的本地化界面输出,但很少提及数据在中间处理过程中如何适应国际化。

  输入和存储阶段就用UniCode方式进行处理和存储,以方便应用以后的国际化。GOOGLE的设计就是一个非常好的国际化应用榜样,我以GOOGLE搜索引擎的国际化支持为例说明如何实现国际化应用的设计。

GOOGLE用户经常有这样的感觉:

  1. 为什么我第一次去GOOGLE,出现的就是中文的界面?
  2. 为什么在所有网站中查中文:有时候还会匹配到日文网站的结果?比如:就以"google 秘密"这个查询为例:我们在输入框输入"google 秘密"
    http://www.google.com/search?hl=zh-CN&newwindow=1&q=google+%C3%D8%C3%DC&btnG=Google%CB%D1%CB%F7&lr=

首先我将GOOGLE对查询的处理流程简单的说明如下:

  1. 客户端浏览器输入;
  2. 查询字符串按客户端系统编码方式(GBK)转换成字节流,并URL Encode后传给GOOGLE;
  3. GOOLGE将输入的字符串URL Decode后,按照客户端的系统编码方式将这个字符串(字节串)解码成UniCode
  4. 查询过程,完全是基于UniCode的匹配过程,比如对于“中文”这2个字在简体繁体中文和日文里都有,因此无论是何种语言的页面包含这2个字的页面都能匹配上。
  5. 结果集输出:将查询结果集的内容(UNICODE)按客户端系统编码方式(GBK)“编码”成的字节流,返回给浏览器

具体说明:

  • GOOGLE如何识别出浏览器使用的“界面语言”:GOOGLE获得这个查询字符串的同时,一般会根据hl=zh-CN这个参数, 知道了客户端使用的字符集编码方式,如果用户第一次访问:GOOGLE会根据浏览器的发送的请求中包含的Accept language: zh_cn这个头信息来判别,这就是为什么现在很多用户第一次去GOOGLE的时候它就能自动识别出来的原因。这个参数在之后的查询和翻页过程中通过 cookie保存,并通过get方式一直传递给GOOGLE(因此你也可以使用使用偏好设置界面语言),从而可靠地识别出客户端的编码方式。
  • GOOGLE如何查询:也许从URL上你可以看到:传过去的“秘密”这个查询实际上是%C3%D8%C3%DC=>"秘密"这2个字按GBK(WINDOWS客户端缺省的编码方式)编码方式的4个字节然后再URLEncode后的形式(关于中文编码方式请参考:汉字的编码方式),GOOGLE 将查询字符串按这个编码方式解码并转成UniCode,然后用这个UniCode编码方式的字符串进行内部的查询操作。而任何语言的页面都是先转换成 UniCode后存储在GOOGLE的数据索引库里的。在UniCode中日文和中文写法一样的字,用的是同样的编码。因此,如果你没有指定语言过滤的话,日文网页的结果就首先被命中了;因此,对于中文客户端的查询:如果相应字符在UniCode中和繁体,日文映射的字一样,就可以匹配到相应的日文网页,繁体中文网页...,GOOGLE的查询结果也首先是UniCode的,最后将UniCode结果按照客户端的编码方式转换成字节流,返回到客户端。

从以上的分析中我们可以看出:UniCode非常漂亮的解决了应用的国际化问题。对于应用前端来说,剩下的工作就是根据本地编码环境进行本地化的过程了。

  1. 数据从输入的开始,就全部先转换成UniCode,然后再进行处理,并按照UniCode方式集中存储(UniCode inside)
  2. 数据输出过程中,只是在最后输出到客户端的时候,按照客户端的本地化设置将UniCode数据转换成本地字符集,并配以相应语言/字符的界面(Localization outside)

  如果应用的开发只是满足于在国内市场自给自足,“汉化”的思路的大量出现是很自然的。但要是把“汉化”比作UCDOS和RichWin的话,那么这种汉化方式迟早要被内核汉化的WIN95淘汰的。毕竟核心级别对国际化的支持才是一个真正简化前端应用设计、通用的解决方案。Microsoft和Sun等国际化大公司的产品从一开始就是为全球市场设计的,因此对国际化的支持一致非常重视。相比之下国内软件行业对相应国际标准显然重视不足,也很少积极地参 与相关标准制定。
  转自:http://www.chedong.com/tech/unicode_java.html#google



---------------------------------------
据说Google修改过一次它的编码处理方式:

  GOOGLE的国际化做得很好。我们知道,你在www.google.com里面输入一个检索词,然后便会生成一个HTTP的GET请求。这个请求一般有几个参数,以前的http://www.google.com/search?q=%s就是最简单的一个,%s就是用来代替你输入的值的。但GOOGLE是一个面对全球服务的站点。它收到请求后会解释q的值。如果大家写过JSP或者JAVA程序,就会经 常陪到getParameter得到的中文是乱码。这里面就是一个编码问题。浏览器的地址栏内的URL,一切非正常字符(A- z,0-9,:,.等)都会进行编码(Encode,一个%号,然后加上它的ASCII内码,一个中文一般会编码成为两个,如“中 文”两个字会编码为:%D6%D0%CE%C4,然后程序收到请求后会进行相应的解码。
  GOOGLE近期改进了它的编码方案,即是在生成URL的时候,由客户端按照指定的编码进行Encode,查看 www.google.com主页的源文件,你会发觉encodeURIComponent这个Javascript的函数。默认情况下,会用Javascript的 功能,把输入的检索词进行UTF-8编码,“中文”两个字就会编码成:%E4%B8%AD%E6%96%87,一共六个字节。这时如果还是按照四个字节进行解码,就会出错,也就是乱码。可以对比默认情况下的编码,是四个字节。具体关于字符编码的内容,就不在这里讨论。

再来看Google配置检索式的时候的几个参数:

[*]ACTION地址: http://www.google.com/search?
[*]q 检索的词,即你在输入框内输入的内容,会进行URL Encode编码
[*]lr 检索范围。如“lr=”表示检索所有的网站,lr=lang_zh-CN表示检索中文简体,lr=lang_zh-CN|lang_zh-TW表示 中文网页(简繁)
[*]ie 指示浏览器URL的编码,Google会将q的值按照这个编码来进行解码(这个最重要)
[*]oe Outlook的编码??(这个参数暂不清楚什么意思,目前对检索没有影响,直接给一个值,或者不要也行


这时就可以按需进行组合了,名和值之前为“=”,每个之间以“&”进行连接
如:http://www.google.com/search?q=%s&ie=GB2312&lr=lang_zh-CN
意思为:浏览器的URL编码为GB2312,检索范围为“中文网页”

http://www.google.com/search?q=%s&ie=UTF-8&lr=lang_zh-CN
意思为:浏览器的URL编码为UTF-8,检索范围为“简体中文网页”

如果是检索图像,把search换成images就行了,其它不变。
http://images.google.com/images?q=%s&ie=UTF-8&lr=lang_zh-CN

//关于这篇文章的内容,我们其实可以测试一下就能了解了。在google搜索两个中文,之后添加一个&ie=gb2312结果就会出现乱码。


================================================================================待续。。。

2008-10-26

NFS的配置和使用

  一般来说,在linux/unix下,如果需要挂载网络上另外一台服务器的目录的话nfs是最方便且容易实现的一种方法了。
  目前NFS已经到了V4版本了。
  自从 1984 年推出以来,网络文件系统 (NFS) 已成为网络文件共享的标准,尤其是在UNIX® 和 Linux® 社区中。过去 20 年以来,NFS 协议已慢慢适应新需求和市场变化。
  
  下面开始配置:

首先。
  需要作为nfs服务器的主机需要开启nfs服务,并且在/etc/exports中列出允许共享的目录。开启服务只需要
/etc/init.d/nfs start
就可以,但是为了以后自动启动,可以使用chkconfig命令来配置服务的启动。
chkconfig --level 345 nfs on
修改/etc/exports
修改的规则是每个共享目录一行,比如
/home/test 192.168.0.11(ro,sync, no_root_squash) 192.168.0.12(rw,sync)
这里的意思就是把/home/test目录分别共享给192.168.0.11和192.168.0.12,前者只读后者读写权限。
详细的参数介绍:

rw: 可读写的权限;
ro: 只读的权限;
no_root_squash: 登入到NFS主机的用户如果是ROOT用户,他就拥有ROOT的权限
root_squash: root用户的所有请求映射成如anonymous用户一样的权限(默认)
all_squash: 不管登陆NFS主机的用户是什么都会被重新设定为nobody。适合公用目录。
no_all_squash: 保留共享文件的UID和GID(默认)
anonuid: 将登入NFS主机的用户都设定成指定的user id,此ID必须存在于/etc/passwd中。
anongid: 同 anonuid ,但是变成 group ID 就是了!
sync: 资料同步写入存储器中。
async: 资料会先暂时存放在内存中,不会直接写入硬盘。
secure: NFS通过1024以下的安全TCP/IP端口发送
insecure: NFS通过1024以上的端口发送
wdelay: 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay: 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide: 在NFS共享目录中不共享其子目录
no_hide: 共享NFS目录的子目录
subtree_check: 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check: 和上面相对,不检查父目录权限

每次修改/etc/exports目录之后需要让其生效可以重启nfs服务,或者使用exportfs命令
参数解释:

-a :全部mount或者unmount /etc/exports中的内容
-r :重新mount /etc/exports中分享出来的目录
-u :umount 目录
-v :在 export 的时候,将详细的信息输出到屏幕上。

-----------------------
客户机:
  在客户机要挂载nfs分区使用的是
mount -t nfs 10.1.1.11:/home/test /mnt
其中10.1.1.11:/home/test为服务器端ip和共享的目录,/mnt为本机要挂载的目录

-----------------------------------------
2008-11-17更新:
开机自动启动:
因为我不需要automount的特性,所以直接修改/etc/vfstab
说明:
格式:
device to mount device to fsck mount point FS type fsck pass mount at boot mount options

* device to mount 指定远程服务器名和共享路径。远程服务器名和共享路径用冒号分开。
* device to fsck 这个是空的。从来不从客户机进行文件检测。
* mount point 指定本地的mount点。这个目录必须是已经存在的。
* FS type 对于nfs资源系统来说,当然是nfs了。
* fsck pass 这个也是空的。表示不从客户机进行文件系统检测。
* mount at boot 选择yes or no,yes就是启动时自动安装。
* mount options 用逗号分隔的mount命令的列表。

例如:
# vi /etc/vfstab 添加:
peng:/export/home/peng/games - /export/home/games nfs - yes soft,bg

表示开机自动把远程主机peng的/export/home/peng/games目录自动挂到本机的/export/home/games下。soft选项是目录不能安装,产生一个错误。bg选项,系统启动过程中安装在后台。

2008-10-06

简单的ssh隧道代理的方法

服务器端:
  /etc/ssh/sshd_config中把AllowTcpForwarding后面的no改成yes,就是开启tcp转发啦。

客户端:
  ubuntu下直接用命令
ssh -ND 10000 -p 2222 username@remotehost
  意思就是用-D指定本地端口-N就是不指定远程命令,直接把ssh后台运行用以端口转发。
  -p指定ssh服务器的端口,如果默认的话可以不用这个参数。
  执行完命令等待输入口令以后就可以了。接下来只要在需要代理的地方填上localhost 10000就可以通过remotehost来代理上网了。。。

2008-10-03

Solaris环境下Tomcat的安装配置以及与Apache的整合

  在最开始,安装之前现了解一下背景知识是相当有用的。

  Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序,你也可以将该端口改为 80。

  但是鉴于以下原因,我们需要整合Apache和Tomcat:

  1. 提升对静态文件的处理性能
  2. 利用 Web 服务器来做负载均衡以及容错
  3. 无缝的升级应用程序

  由于Tomcat本身就是Apache软件基金会的一个项目,自然它肯定能够很好的和Apache结合。因此很多服务器都采用这种方式。

  一般来说,要进行这种集成,我们一般希望让静态的页面有apache处理,动态的jsp就由tomcat处理。


目前有三种方法可以将 apache 和 tomcat 整合在一起。

JK:

This is the top-level entry point of the documentation bundle for the Apache Tomcat Connectors

Select one of the links from the navigation menu (to the left) to drill down to the more detailed documentation that is available. Each available manual is described in more detail below.

  上面就是JK的官方介绍,它本来就是tomcat项目的一部分。

http_proxy :

  直接利用Apache自带的 mod_proxy 模块使用代理技术来连接 Tomcat。http_proxy 模式是基于 HTTP 协议的代理,因此它要求 Tomcat 必须提供 HTTP 服务,也就是说必须启用 Tomcat 的 HTTP Connector。

ajp_proxy:

ajp_proxy 连接方式其实跟 http_proxy 方式一样,都是由 mod_proxy 所提供的功能。配置也是一样,只需要把 http:// 换成 ajp:// ,同时连接的是 Tomcat 的 AJP Connector 所在的端口。
简单来说这三种方法就是:
 通过ajp13协议,apache将动态内容的请求转发给tomcat
 在apache进程中运行tomcat来处理动态内容  
 使用本地高速Unix domain socket,apache将动态内容的请求转发给tomcat


  实际上虽然后两者在性能上不会逊色多少,而且更简便灵活,但是在稳定性上恐怕还是JK更胜一筹,所以我还是使用JK来配置吧。


  找了很多资料,最终对我有帮助的就只有两个信息。一个是前面这个,另外一个就是这种连接的原理:假设apache使用端口是80,tomcat使用端口是8080。服务器ip是10.1.1.12这个时候,当我们通过http://10.1.1.12访问网站的时候内容是由apache处理的,当我们通过http://10.1.1.12:8080访问网站的时候,内容就是有tomcat处理的。但是,当整合成功以后,我们通过http://10.1.1.12访问网站中的jsp页面,比如http://10.1.1.12/test.jsp时,apache会把请求转给tomcat来处理。
  这个就是我们整合的终极目标了,也是通过这个来判断是否整合成功。而通过apache转给tomcat的请求在tomcat的status的jkstutus中能看到:

jk-8009

Max threads: 200 Current thread count: 4 Current thread busy: 3
Max processing time: 369 ms Processing time: 0.374 s Request count: 3 Error count: 1 Bytes received: 0.00 MB Bytes sent: 0.00 MB

StageTimeB SentB RecvClientVHostRequest
K44520 ms??10.1.1.111??
K2680 ms??10.1.1.111??

P: Parse and prepare request S: Service F: Finishing R: Ready K: Keepalive



那么,接下来我们开始动手。。。

我的apache已经装好了,那么先装好tomcat:

开始安装之前先添加JAVA_HOME路径到环境变量:
JAVA_HOME=/usr/java
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
CATALINA_BASE=/usr/local/tomcat
CATALINA_HOME=/usr/local/tomcat
JRE_HOME=/usr/java/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$CATALINA_HOME/bin:/usr/sfw/bin:/usr/ccs
export PATH JAVA_HOME CLASSPATH CATALINA_BASE CATALINA_HOME JRE_HOME


之后解压官方下载的包,然后拷贝到安装的目录下,执行
./bin/startup.sh
之后打开http://localhost:8080
出现成功信息就表示安装成功了。
安装JK:
  根据说明文件直接编译吧

配置:
  要配置好Apache和Tomcat的整合,必须要配置这三个文件:

httpd.conf
Apache 服务器的配置文件,用来加载 JK 模块以及指定 JK 配置文件信息

workers.properties
到 Tomcat 服务器的连接定义文件

uriworkermap.properties
URI 映射文件,用来指定哪些 URL 由 Tomcat 处理,你也可以直接在 httpd.conf 中配置这些 URI,但是独立这些配置的好处是 JK 模块会定期更新该文件的内容,使得我们修改配置的时候无需重新启动 Apache 服务器。



cp ./conf/workers.properties /usr/local/apache/conf/
cp ./conf/uriworkermap.properties /usr/local/apache/conf/
之后按照这个文件里面的提示修改文件吧。
然后编辑apache的httpd.conf,以下是官方文档里的内容
# Load mod_jk module
# Update this path to match your modules location
LoadModule jk_module modules/mod_jk.so
# 加载jkmodule的参数
# Where to find workers.properties
# Update this path to match your conf directory location (put workers.properties next to httpd.conf)
JkWorkersFile /etc/httpd/conf/workers.properties
# 指定workers.properties的所在路径
# Where to put jk shared memory
# Update this path to match your local state directory or logs directory
JkShmFile /var/log/httpd/mod_jk.shm
# Where to put jk logs
# Update this path to match your logs directory location (put mod_jk.log next to access_log)
JkLogFile /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the timestamp log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# Send everything for context /examples to worker named worker1 (ajp13)
JkMount /examples/* worker1、
# 将/examples虚拟路径下的所有内容转有worker1处理,其实这个worker1就是jk的配置文件中配置用于连接apache和tomcat的东西。
除了这些外,我们应该自己添加的东西:
JkMount /*.do worker1
JkMount /*.jsp worker1
#类似上面,指定目录下所有扩展名为.do .jsp的文件由worker1来处理

之后修改/usr/local/apache/conf/worker.properties
基本上按照说明修改一些路径就可以了。上面在httpd.conf中指定的worker1应该出现在worker.list中,并且拥有worker.worker1.type=ajp13.
此外这个文件还可以用来配置负载均衡,不过我暂时不需要了。所以就没有配置了。而且默认的文档里其实已经有配置一个loadbalancer,如果需要我们只需要把worker.list后面的对象改成loadbalancer前面的worker1自然也改成这个就可以了。worker.list指定的对象是告诉jk哪些worker是可用的。


这样配置之后,基本就没有问题了。开启tomcat和apache看看。

最后记得在启动脚本里增加tomcat的自动启动。

参考文章:http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/index.html



---------------------------------------------------------------
此外,如果需要将tomcat的管理统一到Solaris的smf之中,可以这样做:

vi /var/svc/manifest/network/tomcat.xml
文件内容:

<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='Tomcat'>
<service name='application/server/tomcat' type='service' version='1'>
<single_instance />
<dependency
name='filesystem'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/filesystem/local' />
</dependency>
<exec_method
type='method'
name='start'
exec='/opt/Webservices/tomcat/bin/startup.sh'
timeout_seconds='300' />
<exec_method
type='method'
name='stop'
exec='/opt/Webservices/tomcat/bin/shutdown.sh'
timeout_seconds='300' />
<instance name='default' enabled='true' />
<stability value='Unstable' />
<template>
<common_name>
<loctext xml:lang='C'>Tomcat6.018</loctext>
</common_name>
</template>
</service>
</service_bundle>

之后
svccfg validate 和 svccfg improt这个文件即可。

2008-10-02

Apache配置文件的说明

就是./conf/httpd.conf中的配置的说明:

ServerRoot:
  指定apache的daemon的运行目录,可以理解为apache安装的目录。http启动之后会将进程的当前目录改变到这个目录。因此,这个配置文件中指定的相对路径就是这个路径的相对路径了。
  此外,由于NFS文件系统在文件加锁方面能力有向,因此,不应该把这个目录指定为NFS文件系统的目录。根据此配置文件中的说法,不应该在目录明最后加斜杠,如果把这个路径指向一个非本地磁盘,则必须指定LockFile在本地磁盘上。如果要然多个httpd共享此目录,则必须指定LockFile和PidFile:

LockFile /var/run/httpd.lock
  LockFile参数指定了httpd守护进程的加锁文件,一般不需要设置这个参数, Apache服务器将自动在ServerRoot下面的路径中进行操作。但如果ServerRoot为NFS文件系统,便需要使用这个参数指定本地文件系统中的路径。

PidFile /var/run/httpd.pid
  PidFile指定的文件将记录httpd守护进程的进程号,由于httpd能自动复制其自身,因此系统中有多个httpd进程,但只有一个进程为最 初启动的进程,它为其他进程的父进程,对这个进程发送信号将影响所有的httpd进程。PidFILE定义的文件中就记录httpd父进程的进程号。
此外,这个部分还包括以下详细性能配置:
  • Timeout 120 //120秒后断开连接
  • KeepAlive on //支持HTTP1.1中的一次连接传递多个HTTP请求的功能
  • MaxKeepAliveRequests 30 //设置一次连接的最大HTTP请求次数,0表示无限
  • KeepAliveTimeout 15 //服务器完成请求之后如果在这个时间内未获得请求就断开连接
  • MinSpareServers 5 MaxSpareServers 10 //最少/最大空余子进程数量,空余子进程创建随时等候请求的空闲子进程以便提升响应请求的能力
  • StartServers 5 //设置apache启动时启动的子进程数量因此应介于上述两者之间
  • MaxClients 150 //设置服务器支持的最大并发访问的客户数,因此这个参数应该大于MaxSpareServers
  • MaxRequestsPerChild 30 //每个子进程响应服务的次数,应该让子进程在一定时候销毁,生成新的子进程来替代它,能够保证系统的稳定性。默认30,基本上可以设置在1000左右

Listen 80:
  指定服务器除了80端口外还监听其他的端口的HTTP请求,貌似一般对虚拟主机比较有用。

AddModule:
  Apache服务器的一个重要特性就是其模块化的结构,这不但表现为其能在编译时能通过新的模块加入新的功能,还表现为其模块可以动态加载入http服务程序中,而不必载入不需要的模块。使用Apache的动态加载模块只需要设置好Load Module和AddModule参数就可以了,这种特性就是Apache的 DSO(Dynamic Shared Object)特性,然而要想充分使用DSO特性仍然不是一个简单的事情,不适当的改动这里的设置就可能造成服务器不能正常启动。因此如果不是要增加或减 少服务器提供的功能,就不要改动这里的设置。
  Apache默认支持很多模块,但是事实上很多模块是没有必要的,不必要模块不会被载入内存。模块可以静态连接到Apache 服务器内部,也可以这样动态加载,将Apache的特性都编译成动态可加载模块是该Port的做法,而不是Apache的缺省做法,这样就以牺牲很小的性能的同时,带来极大的灵活性。
  在我的Apache2.2.9中,默认模块都被放在./modules目录下。


Port 80:
  设置httpd使用的端口,因为unix下使用小于1024的端口必须要root权限,所以如果使用非root帐户启动,必须使用大于1024的端口,不过因为Apache httpd本身能够以root权限打开端口后切换的普通用户身份运行,这样减少了危险.

User nobody
Group nogroup:
  Apache在打开端口后会切换到这里设定的用户权限运行,默认使用这两个权限在系统里没有文件,因此保证了服务器和它的进程没有修改文件系统的权限。当时有时候php会访问服务器上的文件,可能会产生所谓的nobody拥有的文件,这种文件能够被其他程序同样使用nobody权限来访问,似乎有安全问题,而且也不易操作,我记得Matt Cutts前段时间就在他的blog上提到他的服务器出现了php生成的nobody拥有的文件,无法删除。因此应该自己创造一个新的用户和组来作为apache的运行用户。

ServerName:
  默认情况下不需要指定这个参数,这个是apache自动解析得到的名字。

DocumentRoot "/www/" :
  这个是外部访问服务器的根路径,如果FollowSymLinks设定允许的话。在这个目录底下的符号连接指向的文件同样能被访问到。

下面是整段一起的代码:
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
  Apache服务器可以针对目录进行文档的访问控制,然而访问控制可以通过两
种方式来实现,一个是在设置文件 httpd.conf(或access.conf)中针对每个目
录进行设置,另一个方法是在每个目录下设置访问控制文件,通常访问控制文件
名字为.htaccess。虽然使用这两个方式都能用于控制浏览器的访问,然而使用配置文件的方法要求每次改动后重新启动httpd守护进程,比较不灵 活,因此主要用于配置服务器系统的整体安全控制策略,而使用每个目录下的.htaccess文件设置具体目录的访问控制更为灵活方便。
  Directory语句就是用来定义目录的访问限制的,这里可以看出它的标准语法,为一个目录定义访问限制。上例的这个设置是针对系统的根目录进行限制的,设置了允许符号连接的选项FollowSymLinks ,以及使用AllowOverride None表示不允许这个目录下的访问控制文件来改变这里进行的配置,这也意味着不用查看这个目录下的相应访问控制文件。
  由于Apache对一个目录的访问控制设置是能够被下一级目录继承的,因此对
根目录的设置将影响到它的下级目录。注意由于AllowOverride None的设置,使
得Apache服务器不需要查看根目录下的访问控制文件,也不需要查看以下各级目
录下的访问控制文件,直至httpd.conf(或access.conf )中为某个目录指定了
允许Alloworride,即允许查看访问控制文件。由于Apache对目录访问控制是采用的继承方式,如果从根目录就允许查看访问控制文件,那么 Apache就必须一级一级的查看访问控制文件,对系统性能会造成影响。而缺省关闭了根目录的这个特性,就使得Apache从httpd.conf中具体 指定的目录向下搜寻,减少了搜寻的级数,增加了系统性能。因此对于系统根目录设置AllowOverride None不但对于系统安全有帮助,也有益于系统性能。



Options FollowSymLinks :
  Options选项指定该目录的特性,这里FollowSymLinks允许通过符号连接访问到此目录下的文件。此外还有ExecCGI可以支持目录下执行cgi程序,Indexes允许浏览器生成此目录下文件的索引列表。

AllowOverride None :
  忽略这个目录下的访问控制文件,如果用All则相反。

Order deny,allow:
  定义处理deny和allow的顺序,deny allow是控制访问的。
  
Deny from all:
  表示拒绝所有客户机访问此目录。


DirectoryIndex index.html:
  很熟悉的东西了。。

ServerSignature Off:
  是否在错误报告中显示服务器信息。


ScriptAlias /cgi-bin/ "/www/cgibin/" 
  这里定义的路径将直接访问,而不遵从DocumentRoot。

AddType application/x-httpd-php .phtml

  指定后缀名的文件被定义为指定的MIME类型。

2008-10-01

面试必须准备的一些问题

简介:工作面试时最难的25个问题,很 好的准备是成功的一半。如果你是一个对目前的职位不满意,正着手去在新的一年里找到一个新的职位,这篇文章就是你的一个帮手。工作面试是你去面对未来的老 板的征途中最重要的一个过程。你必须像进行一个击剑锦标赛或着一个国际象棋比赛那样的坚韧和敏捷来对待面试。


准备是成功的一半如果你是一个对目前的职位不满意,正着手去在新的一年里找到一个新的职位,这篇文章就是你的一个帮手。工作面试是你去面对未来的老板的征途中最重要的一个过程。你必须像进行一个击剑锦标赛或着一个国际象棋比赛那样的坚韧和敏捷来对待面试。

本文是从 William J. Morin和James C. Cabrera 的“在失业的时候如何生存并成功的找到另一个工作”一文中摘选出来的。版权所有:Drake Beam Morin, inc;出版:Harcourt Brace Jovanovich。

Morin是纽约的Drake Beam Morin公司的董事长,Cabrera是该公司的主席。该公司是国家主要的新职介绍公司,办公所在地在费城。

1.介绍你自己

这个问题通常是一个面试的开始的第一个问题,要额外的小心不要滔滔不绝。尽可能的让你的回答在一分钟,最多2分钟的时间内结束。你的回答应该包含以下4个 主题:早期生活,教育背景,工作背景以及最近的工作经验。要着重强调最后的那个主题。要牢记这个问题通常是一个热身的问题,不要把你的最重要的观点浪费在 这个问题上。


2.你对我们公司有什么样的了解

你必须能够谈论关于这个公司的产品,服务,收入,业界声望,形象,目标,存在的问题,管理风格,职工,历史和企业文化等问题。但是不要表现出你对这个公司 的一切都了如指掌。让你的回答能够体现出你对该公司做了一些研究,但是不要让面试官被你打败(overwhelm),并表现出你希望能够了解关于公司更多 的情况。

你可以用这样的态度来开始回答问题:“在我的寻找工作的过程中,我调查研究了很多公司,出于如下的理由,贵公司是我感兴趣的公司之一:”。

用一个积极的态度来回答这个问题,不要这样说:“每个人都告诉我这个公司处于困境中,有各种样的麻烦,这就是我来这儿的原因”,即是那的确是你在这儿的理由。


3.为什么你希望来我们公司工作?

最糟糕的答案就是“因为我喜欢人”。要是你喜欢的是动物,那你去哪工作呢?在 这个问题的回答上,并且贯穿整个面试的过程中,一个优秀的答案总是来自于你所作的调查研究,这样的话你可以从公司的需要那个方面来回答。你可能说你的研究 表明这个公司所做的工作正是你说希望参与的,并且他们做这个工作的方式极大的吸引了你。例如,如果这个公司由于强大的管理而著称,纳闷你的答案可以提到这 个事实,并表示你希望成为这个小组的一员。如果这个公司着重强调研发,那么就强调你希望创造你的事物,而你知道这个公司非常鼓励这样的行为。如果这个公司 强调经济控制,你的答案就应该包含对数字的热爱。

如果你觉得你必须捏造一个答案,例如如果这个公司强调研发,但是你觉得你必须提到这一点而实际上你对这根本不感兴趣,那么你可能根本不应该参加这个面试,因为你可能根本不会考虑在这个公司工作。

你的之前的准备必须包括对这个公司做详尽的了解,来避免到一个你无法发挥才干或者根本不想去的公司面试。大多数人都不擅长说谎,所以在面试中欺瞒面试官是一件很困难的事情。即使你成功的做到了这一点,你所获得的也只是一个你不想参加的工作


4.你可以为我们完成哪些其他人做不到的事情?

这个问题上,你有权利或者是义务来自吹自擂。谈论一些你完成工作的记录,提到你简历中的独特之处,或者列出你职业生涯中的成就。告诉别人,你的技能和兴趣 在获取这些结果的过程中发挥了很大的作用,并使得你很有价值。提到你能够合理的安排工作优先顺序,找出问题,并利用你的经验和精力来解决问题

5.你觉得这个职位最吸引你的地方是什么?最不吸引你的地方又是什么?

列出3到4个这个工作吸引人的方面,然后提出一个简单的不重要的不吸引人的问题。


6.为什么我们应该雇佣你?

参见问题4, 考虑你的能力,你的工作经历和你的干劲。

7.你希望在工作中能够获得什么?

让你的答案来源与这个公式提供的机会。谈论你希望能够大展身手并获取认可的要求。让你的答案基于工作机会而不是个人的要求

8.谈论一下你对你应聘的这个职位的定义

你的答案应该简短并且是基于工作要求的。考虑这个工作的责任和义务。在你回答问题之前确定你真正的了解这个职位所涉及的方方面面。如果你不确定,就去问面试官,他可能会帮你回答这个问题。


9.你需要多久能够对公司做出显著的贡献?

答案要实际一点。可以这样回答,尽管你希望从第一天开始就能够满足公司紧迫的要求,并开始发挥作用,但是你可能需要6个月到1年的时间来足够了解这个公司及其需要来做出很大的贡献。

10.你会在公司工作多久?

可以这样回答,你对在这个公司的职业生涯很感兴趣,可是也得承认你必须能够不断感觉到有挑战才能够继续在任何公司呆着。可以考虑这样的语句“只要我们双方都感觉有收获”。


11.你的简历显示你的能力超出了这个工作的要求,你是如何认为的?

强调你对在这个公司开始一个长期的合作的兴趣,你可以说你认为如果你在这个职位上表现的很好,公司还会为你提供新的机会。也要提到一个好公司需要好的职 员。有检验的职员总会有很好的奖励;既然你是如此的很是这个职位,雇主将会很快从他的投资中获得回报。一个发展中的,充满活力的工资永远不会嫌天才多的。


12.你的管理方式是什么样的?

你必须对这个公司的风格有足够的了解,这样才能让你的管理风格对其进行补充。可能的风格包括:基于任务的(我喜爱问题-研究那些是错误的,选择一个解决方 案并完成),基于结构的(我做出的任何一个管理的决定是基于它是如何影响问题的底线的),或者是家长式作风的(我致力与管理好我的每一个下属,并给他们指 引正确的方向)。

民主参与式的风格是目前比较流行的一种:一个开放的管理方式,通过激励手下并根据所负责的事情分派任务来完成每一件事情。

当你考虑这个问题的时候,要思考你的风格是否会让你在这个公司里高兴并有效率的工作。

13.你是一个合格的经理吗?你可以举一些例子吗?你是否觉得你有顶级管理人员的潜力?

保证你的答案是基于成果和任务的。通过你职业生涯中的一些例子来加固你的论点。强调你的经验和精力

14.当你招聘人手的时候你需要什么类型的?

考虑一些技能方面的问题。主动性,以及能够舒服和有效的与其他人一起工作的适应性。提到你希望雇佣一些看起来能够在公司中获得提升的人。

15.你是否曾经不得不解雇一些员工?是什么理由?你是如何解决这个情况的?

要承认这个情况不是容易解决的,但是你还是很好的解决了,不管是从公司角度还是从个人角度。让他们知道,和其他人一样,你不喜欢这种让人不乐意的工作,但是你可以有效的富有人情味的解决问题,尤其是在要解雇某个人的时候。

16.你认为作为一个经理或者高级行政人员最困难的事情是什么?

要提到指定计划,指定和成本控制。最困难的任务是要去激发并管理雇员来完成一些计划中的事情,并且按时的在预算范围内完成任务。


17.在我们这个行业中你觉得什么是最重要的趋势?

一样要准备两到三个趋势来阐明你对所在行业的是多么的了解。你可以需要考虑技术上的挑战或者机会,金融环境甚至管理的需求作为你所应该考虑收集的关于你的行业说面对的状况。

18.你为什么离开你现在的工作(上一个工作)?

在不伤害你自己的情况下要简明扼要并诚实的回答这个问题。回溯到你寻找工作的计划阶段,那时你正在把这个话题当作你的工作经历。如果你是在一次公司裁员中 被裁掉的,直接说出来好了;否则的话,要指明这次离职是你自己的决定,你自己行动的结构,不要特到任何关于性格冲突等。


19.你觉得放弃原来所有的福利待遇等来寻找一个新的工作是什么感觉?

要提到你很自然的担心这一点,但是并不很恐慌。你愿意为寻找到合适的工作而冒一点风险。不要说,你对安全感比成功的完成工作更感兴趣。

20.在你上一份工作中,你最喜欢那个方面的特点?最不喜欢哪个?

要小心而计息的回答这个问题。要多说你喜欢的特性,而少说你不喜欢的。不要引用个人的问题。如果你使得你的上一份工作听起来很糟糕,面试官会疑问你为什么还能在上一份职位上一直待到现在。

21.你如何看待你的老板?

要尽可能积极的回答这个问题。你潜在的未来的老板很希望能够了解你未来在相似的场合会如何谈论他

22.你在现在的年龄中为什么不能赚到更多?

要告诉他这是你寻找新的工作的理由之一,不要处于守势。

23.你希望这个职位的薪水是多少?

讨论薪水是一个很微妙的问题。我们建议你在条件允许的情况下尽可能的拖延用一个精确的数据来回答这个问题。你可以说,“我知道这个工作的薪水的大概范围是¥---到¥---。这个对于我来说是合适的价位。”你也可以用一个问题来回答这个问题:

“你可能在这个问题上可以帮助我。你能否告诉我在公司中对相似职位的工作的大概薪水是多少?”。

如果你是在一个最初的面试中遇到这个问题,你可以说你觉得你需要更多的了解这个职位的职能才能够对这个问题有个有意思的回答。在这个问题上通过询问面试官 或者人事高级主管或者自己去寻找结果,你可以尝试去获得这份工作是由有一个工资等级。如果有,并且你能够接受,那么直接回答你满意这个薪水范围好了。

如果面试官继续纠缠这个问题的话,你可以说“我现在的薪水是¥--。和其他人一样,我希望能够提升这个数字,但是我主要的兴趣还是在工作本身。”要记住,获取一个新的工作这件事本身不会使得你能够赚到更多的钱。

如果一个猎头公司也参与了此事的话,你的联系人可能可以帮助你解决这个薪水的问题。他甚至可以帮你介入此事。例如,如果他告诉你这个职位的待遇,然后你告诉他你现在已经赚那么多的,并且希望待遇能够适当的提升,他可能会去雇主那然后提议给你增加10%的待遇。

如果没有获得关于这个职位的合适的信息,而面试官还继续这个话题的话,你可以用一个具体的数字来回答这个问题。你不能给别人留下待遇完全没有影响你将会接 受任何待遇的印象。如果你年薪8W的话,你不可能没有变现出放弃自己的时候,说3.5W一年也是可以接受的。(如果你是在做工作的一个彻底的变化的话,这 种情况可能也是有道理,可以理解的)。

不要很快就把你自己卖掉:),但是要继续的强调这个工作本身才是你最看重的东西。面试官可能会去判断你希望从这个工作的待遇是多少哦。不要给面试官留下金钱对你来说是唯一重要的事情的感觉。把薪水的问题和工作本身挂钩。

但是无论合适可能的话,在你到面试过程的最后一个阶段之前,少谈论薪水的问题。到那个阶段的时候,你就应该知道,这个公司对你有很大的兴趣,这个时候在谈论薪水待遇的话就会有很大的余地了。

24.你长期的目标是什么?

回到你寻找工作的计划阶段。不要这样回答“我希望能够得到你广告中的工作”。把你的目标与你面试的公司关系起来,“在你们这样一个公司,我希望能够...”

25.你目前位置在工作中是多么的成功?

简介:工作面试时最难的25个问题,很 好的准备是成功的一半。如果你是一个对目前的职位不满意,正着手去在新的一年里找到一个新的职位,这篇文章就是你的一个帮手。工作面试是你去面对未来的老 板的征途中最重要的一个过程。你必须像进行一个击剑锦标赛或着一个国际象棋比赛那样的坚韧和敏捷来对待面试。


准备是成功的一半如果你是一个对目前的职位不满意,正着手去在新的一年里找到一个新的职位,这篇文章就是你的一个帮手。工作面试是你去面对未来的老板的征途中最重要的一个过程。你必须像进行一个击剑锦标赛或着一个国际象棋比赛那样的坚韧和敏捷来对待面试。

本文是从 William J. Morin和James C. Cabrera 的“在失业的时候如何生存并成功的找到另一个工作”一文中摘选出来的。版权所有:Drake Beam Morin, inc;出版:Harcourt Brace Jovanovich。

Morin是纽约的Drake Beam Morin公司的董事长,Cabrera是该公司的主席。该公司是国家主要的新职介绍公司,办公所在地在费城。

1.介绍你自己

这个问题通常是一个面试的开始的第一个问题,要额外的小心不要滔滔不绝。尽可能的让你的回答在一分钟,最多2分钟的时间内结束。你的回答应该包含以下4个 主题:早期生活,教育背景,工作背景以及最近的工作经验。要着重强调最后的那个主题。要牢记这个问题通常是一个热身的问题,不要把你的最重要的观点浪费在 这个问题上。


2.你对我们公司有什么样的了解

你必须能够谈论关于这个公司的产品,服务,收入,业界声望,形象,目标,存在的问题,管理风格,职工,历史和企业文化等问题。但是不要表现出你对这个公司 的一切都了如指掌。让你的回答能够体现出你对该公司做了一些研究,但是不要让面试官被你打败(overwhelm),并表现出你希望能够了解关于公司更多 的情况。

你可以用这样的态度来开始回答问题:“在我的寻找工作的过程中,我调查研究了很多公司,出于如下的理由,贵公司是我感兴趣的公司之一:”。

用一个积极的态度来回答这个问题,不要这样说:“每个人都告诉我这个公司处于困境中,有各种样的麻烦,这就是我来这儿的原因”,即是那的确是你在这儿的理由。


3.为什么你希望来我们公司工作?

最糟糕的答案就是“因为我喜欢人”。要是你喜欢的是动物,那你去哪工作呢?在 这个问题的回答上,并且贯穿整个面试的过程中,一个优秀的答案总是来自于你所作的调查研究,这样的话你可以从公司的需要那个方面来回答。你可能说你的研究 表明这个公司所做的工作正是你说希望参与的,并且他们做这个工作的方式极大的吸引了你。例如,如果这个公司由于强大的管理而著称,纳闷你的答案可以提到这 个事实,并表示你希望成为这个小组的一员。如果这个公司着重强调研发,那么就强调你希望创造你的事物,而你知道这个公司非常鼓励这样的行为。如果这个公司 强调经济控制,你的答案就应该包含对数字的热爱。

如果你觉得你必须捏造一个答案,例如如果这个公司强调研发,但是你觉得你必须提到这一点而实际上你对这根本不感兴趣,那么你可能根本不应该参加这个面试,因为你可能根本不会考虑在这个公司工作。

你的之前的准备必须包括对这个公司做详尽的了解,来避免到一个你无法发挥才干或者根本不想去的公司面试。大多数人都不擅长说谎,所以在面试中欺瞒面试官是一件很困难的事情。即使你成功的做到了这一点,你所获得的也只是一个你不想参加的工作


4.你可以为我们完成哪些其他人做不到的事情?

这个问题上,你有权利或者是义务来自吹自擂。谈论一些你完成工作的记录,提到你简历中的独特之处,或者列出你职业生涯中的成就。告诉别人,你的技能和兴趣 在获取这些结果的过程中发挥了很大的作用,并使得你很有价值。提到你能够合理的安排工作优先顺序,找出问题,并利用你的经验和精力来解决问题

5.你觉得这个职位最吸引你的地方是什么?最不吸引你的地方又是什么?

列出3到4个这个工作吸引人的方面,然后提出一个简单的不重要的不吸引人的问题。


6.为什么我们应该雇佣你?

参见问题4, 考虑你的能力,你的工作经历和你的干劲。

7.你希望在工作中能够获得什么?

让你的答案来源与这个公式提供的机会。谈论你希望能够大展身手并获取认可的要求。让你的答案基于工作机会而不是个人的要求

8.谈论一下你对你应聘的这个职位的定义

你的答案应该简短并且是基于工作要求的。考虑这个工作的责任和义务。在你回答问题之前确定你真正的了解这个职位所涉及的方方面面。如果你不确定,就去问面试官,他可能会帮你回答这个问题。


9.你需要多久能够对公司做出显著的贡献?

答案要实际一点。可以这样回答,尽管你希望从第一天开始就能够满足公司紧迫的要求,并开始发挥作用,但是你可能需要6个月到1年的时间来足够了解这个公司及其需要来做出很大的贡献。

10.你会在公司工作多久?

可以这样回答,你对在这个公司的职业生涯很感兴趣,可是也得承认你必须能够不断感觉到有挑战才能够继续在任何公司呆着。可以考虑这样的语句“只要我们双方都感觉有收获”。


11.你的简历显示你的能力超出了这个工作的要求,你是如何认为的?

强调你对在这个公司开始一个长期的合作的兴趣,你可以说你认为如果你在这个职位上表现的很好,公司还会为你提供新的机会。也要提到一个好公司需要好的职 员。有检验的职员总会有很好的奖励;既然你是如此的很是这个职位,雇主将会很快从他的投资中获得回报。一个发展中的,充满活力的工资永远不会嫌天才多的。


12.你的管理方式是什么样的?

你必须对这个公司的风格有足够的了解,这样才能让你的管理风格对其进行补充。可能的风格包括:基于任务的(我喜爱问题-研究那些是错误的,选择一个解决方 案并完成),基于结构的(我做出的任何一个管理的决定是基于它是如何影响问题的底线的),或者是家长式作风的(我致力与管理好我的每一个下属,并给他们指 引正确的方向)。

民主参与式的风格是目前比较流行的一种:一个开放的管理方式,通过激励手下并根据所负责的事情分派任务来完成每一件事情。

当你考虑这个问题的时候,要思考你的风格是否会让你在这个公司里高兴并有效率的工作。

13.你是一个合格的经理吗?你可以举一些例子吗?你是否觉得你有顶级管理人员的潜力?

保证你的答案是基于成果和任务的。通过你职业生涯中的一些例子来加固你的论点。强调你的经验和精力

14.当你招聘人手的时候你需要什么类型的?

考虑一些技能方面的问题。主动性,以及能够舒服和有效的与其他人一起工作的适应性。提到你希望雇佣一些看起来能够在公司中获得提升的人。

15.你是否曾经不得不解雇一些员工?是什么理由?你是如何解决这个情况的?

要承认这个情况不是容易解决的,但是你还是很好的解决了,不管是从公司角度还是从个人角度。让他们知道,和其他人一样,你不喜欢这种让人不乐意的工作,但是你可以有效的富有人情味的解决问题,尤其是在要解雇某个人的时候。

16.你认为作为一个经理或者高级行政人员最困难的事情是什么?

要提到指定计划,指定和成本控制。最困难的任务是要去激发并管理雇员来完成一些计划中的事情,并且按时的在预算范围内完成任务。


17.在我们这个行业中你觉得什么是最重要的趋势?

一样要准备两到三个趋势来阐明你对所在行业的是多么的了解。你可以需要考虑技术上的挑战或者机会,金融环境甚至管理的需求作为你所应该考虑收集的关于你的行业说面对的状况。

18.你为什么离开你现在的工作(上一个工作)?

在不伤害你自己的情况下要简明扼要并诚实的回答这个问题。回溯到你寻找工作的计划阶段,那时你正在把这个话题当作你的工作经历。如果你是在一次公司裁员中 被裁掉的,直接说出来好了;否则的话,要指明这次离职是你自己的决定,你自己行动的结构,不要特到任何关于性格冲突等。


19.你觉得放弃原来所有的福利待遇等来寻找一个新的工作是什么感觉?

要提到你很自然的担心这一点,但是并不很恐慌。你愿意为寻找到合适的工作而冒一点风险。不要说,你对安全感比成功的完成工作更感兴趣。

20.在你上一份工作中,你最喜欢那个方面的特点?最不喜欢哪个?

要小心而计息的回答这个问题。要多说你喜欢的特性,而少说你不喜欢的。不要引用个人的问题。如果你使得你的上一份工作听起来很糟糕,面试官会疑问你为什么还能在上一份职位上一直待到现在。

21.你如何看待你的老板?

要尽可能积极的回答这个问题。你潜在的未来的老板很希望能够了解你未来在相似的场合会如何谈论他

22.你在现在的年龄中为什么不能赚到更多?

要告诉他这是你寻找新的工作的理由之一,不要处于守势。

23.你希望这个职位的薪水是多少?

讨论薪水是一个很微妙的问题。我们建议你在条件允许的情况下尽可能的拖延用一个精确的数据来回答这个问题。你可以说,“我知道这个工作的薪水的大概范围是¥---到¥---。这个对于我来说是合适的价位。”你也可以用一个问题来回答这个问题:

“你可能在这个问题上可以帮助我。你能否告诉我在公司中对相似职位的工作的大概薪水是多少?”。

如果你是在一个最初的面试中遇到这个问题,你可以说你觉得你需要更多的了解这个职位的职能才能够对这个问题有个有意思的回答。在这个问题上通过询问面试官 或者人事高级主管或者自己去寻找结果,你可以尝试去获得这份工作是由有一个工资等级。如果有,并且你能够接受,那么直接回答你满意这个薪水范围好了。

如果面试官继续纠缠这个问题的话,你可以说“我现在的薪水是¥--。和其他人一样,我希望能够提升这个数字,但是我主要的兴趣还是在工作本身。”要记住,获取一个新的工作这件事本身不会使得你能够赚到更多的钱。

如果一个猎头公司也参与了此事的话,你的联系人可能可以帮助你解决这个薪水的问题。他甚至可以帮你介入此事。例如,如果他告诉你这个职位的待遇,然后你告诉他你现在已经赚那么多的,并且希望待遇能够适当的提升,他可能会去雇主那然后提议给你增加10%的待遇。

如果没有获得关于这个职位的合适的信息,而面试官还继续这个话题的话,你可以用一个具体的数字来回答这个问题。你不能给别人留下待遇完全没有影响你将会接 受任何待遇的印象。如果你年薪8W的话,你不可能没有变现出放弃自己的时候,说3.5W一年也是可以接受的。(如果你是在做工作的一个彻底的变化的话,这 种情况可能也是有道理,可以理解的)。

不要很快就把你自己卖掉:),但是要继续的强调这个工作本身才是你最看重的东西。面试官可能会去判断你希望从这个工作的待遇是多少哦。不要给面试官留下金钱对你来说是唯一重要的事情的感觉。把薪水的问题和工作本身挂钩。

但是无论合适可能的话,在你到面试过程的最后一个阶段之前,少谈论薪水的问题。到那个阶段的时候,你就应该知道,这个公司对你有很大的兴趣,这个时候在谈论薪水待遇的话就会有很大的余地了。

24.你长期的目标是什么?

回到你寻找工作的计划阶段。不要这样回答“我希望能够得到你广告中的工作”。把你的目标与你面试的公司关系起来,“在你们这样一个公司,我希望能够...”

25.你目前位置在工作中是多么的成功?

你要回答,总的来说你对你目前为止的职业生涯是很高兴很满意的。列举一些生活中普通的琐事,你觉得你完成的很好,没有怨言。

要想别人展现一个积极和自信的面貌,但是不要夸大其词。例如这样的回答“所有的事情都特别的好!我不能想象一个更好的事情了!我非常的开心。”,会使得面试官觉得你是不是在愚弄他或者你自己。最具有说服力的答案通常都是相当自信的。

你要回答,总的来说你对你目前为止的职业生涯是很高兴很满意的。列举一些生活中普通的琐事,你觉得你完成的很好,没有怨言。

要想别人展现一个积极和自信的面貌,但是不要夸大其词。例如这样的回答“所有的事情都特别的好!我不能想象一个更好的事情了!我非常的开心。”,会使得面试官觉得你是不是在愚弄他或者你自己。最具有说服力的答案通常都是相当自信的。



转自:http://hi.baidu.com/zuso378/blog/item/277235fa2ce3d618a8d311d2.html