上一篇:《最后的武士 The Last Samurai》的观感
下一篇:Last Lecture: Achieving Your Childhood Dreams by Randy Pausch
如何利用php来截取一段中文字符串而不出现乱码(附:ASCII 编码)
米娅 2009年8月23日 13:22:00

首先需要了解一下ASCII编码。下文转自:http://blogger.org.cn/blog/more.asp?name=silenceZRY&id=10239

silenceZRY发表于 2005-11-29 10:22:26

ASCII 编码

数字代表计算机的语言。您的计算机如何使用字母来与程序和其他计算机进行通信?一种方法是把字符集 (字符集:一组共享一些关系的字母、数字和其他字符。例如,标准 ASCII 字符集包括字母、数字、符号和组成 ASCII 代码方案的控制代码。)转换为数字形式。

在 20 世纪 60 年代,标准化的需要带来了美国标准信息交换码 (ASCII) (ASCII:将英语中的字符表示为数字的代码。为每个字符分配一个介于 0 到 127 之间的数字。大多数计算机都使用 ASCII 表示文本和在计算机之间传输数据。)(发音为 ask-kee)。ASCII 表包含 128 个数字,分配给了相应的字符 (字符:字母、数字、标点或符号。)。ASCII 为计算机提供了一种存储数据和与其他计算机及程序交换数据的方式。

ASCII 非打印控制字符

ASCII 表上的数字 0–31 分配给了控制字符,用于控制像打印机等一些外围设备。例如,12 代表换页/新页功能。此命令指示打印机跳到下一页的开头。

ASCII 非打印控制字符表

  进制 字符     进制 字符
0 00   1610 数据链路转意
1 01 头标开始   1711 设备控制 1
2 02 正文开始   1812 设备控制 2
3 03 正文结束   1913 设备控制 3
4 04 传输结束   2014 设备控制 4
5 05 查询   2115 反确认
6 06 确认   2216 同步空闲
7 07 震铃   2317 传输块结束
8 08 backspace   2418 取消
9 09 水平制表符   2519 媒体结束
10 0A 换行/新行   261A 替换
11 0B 竖直制表符   271B 转意
12 0C 换页/新页   281C 文件分隔符
13 0D 回车   291D 组分隔符
14 0E 移出   301E 记录分隔符
15 0F 移入   311F 单元分隔符

ASCII 打印字符

数字 32–126 分配给了能在键盘上找到的字符,当您查看或打印文档时就会出现。数字 127 代表 DELETE 命令。

ASCII 打印字符表

  进制 字符     进制 字符     进制 字符
3220 space   64 40 @   96 60 `
3321 !   65   A   97   a
3422 "   66   B   98   b
3523 #   67   C   99   c
3624 $   68   D   100   d
3725 %   69   E   101   e
3826 &   70   F   102   f
3927 '   71   G   103   g
4028 (   72   H   104   h
4129 )   73   I   105   i
422A *   74   J   106   j
432B +   75   K   107   k
442C ,   76   L   108   l
452D -   77   M   109   m
462E .   78 4F N   110  n
472F /   79 5F O   1116F o
48 30 0   8050 P   11270 p
49   1   8151 Q   113  q
50   2   8252 R   114   r
51   3   8353 S   115   s
52   4   8454 T   116   t
53   5   8555 U   117   u
54   6   8656 V   118   v
55   7   8757 w   119   w
56   8   8858 X   120   x
57   9   8959 Y   121   y
58   :   905A Z   122   z
59   ;   915B [   123   {
60   <   925C \   124   |
61   =   935D ]   125   }
62   >   945E ^   126   ~
63 3F ?   955F _   127 70 DEL



2楼 2009年8月23日 13:59:20 米娅

ASCII码与汉字编码  

一、ASCII码是计算机进行信息交换的最基本字符标准,例如,键盘与计算机主机之间的通信就是靠ASCII的标准来支持的。 例如:大写字母A的ASCII码就是十进制数65,数字0的ASCII就是48,小写字母a的ASCII码就是十进制数97等。   

二、汉字机内码与国标码的换算关系。  

把国标码的汉字代码中的区码与位码分别换算为16进制数,然后再分别加上十六进制数80,即为该汉字的机内码。

按:是不是可以这样理解,上面提到ASCII码从0到127代表的符号(也叫半角,即1个字节),汉字占2个字节,每个字节加上十六进制80,相当于十进制的128,即在原来的半角字符外的空间里表示汉字(也叫全角,即2个字节)。这里应该指的是unicode编码,汉字字符的utf-8编码是三个字节的,即24位。 

对UTF8编码的初步认识!(ZT)
3楼 2009年8月23日 14:13:29 米娅
 转自:http://www.xgdown.com/article/243/61874_1.htm

在网络中有很多地方都有采用UTF8编码,由于要编写与邮件服务端有关的程序,而邮件服务端有些地方用到了UTF8编码,所以对它有了初步的认识!

它其实和Unicode是同类,就是在编码方式上不同!
首先UTF8编码后的大小是不一定,不像Unicode编码后的大小是一样的!

我们先来看Unicode的编码:一个英文字母 “a” 和一个汉字 “好”,编码后都是占用的空间大小是一样的,都是两个字节!

而UTF8编码:一个英文字母“a” 和一个汉字 “好”,编码后占用的空间大小就不样了,前者是一个字节,后者是三个字节!

现在就让我们来看看UTF8编码的原理吧:
因为一个字母还有一些键盘上的符号加起来只用二进制七位就可以表示出来,而一个字节就是八位,所以UTF8就用一个字节来表式字母和一些键盘上的符号。然而当我们拿到被编码后的一个字节后怎么知道它的组成?它有可能是英文字母的一个字节,也有可能是汉字的三个字节中的一个字节!所以,UTF8是有标志位的!

当要表示的内容是7位的时候就用一个字节:0*******  第一个0为标志位,剩下的空间正好可以表示ASCII0-127的内容。

当要表示的内容在8到11位的时候就用两个字节:110***** 10******  第一个字节的110和第二个字节的10为标志位。

当要表示的内容在12到16位的时候就用三个字节:1110***** 10****** 10****** 和上面一样,第一个字节的1110和第二、三个字节的10都是标志位,剩下的空间正好可以表示汉字。

以此类推:
        四个字节:11110**** 10****** 10****** 10******
五个字节:111110*** 10****** 10****** 10****** 10****** 
六个字节:1111110** 10****** 10****** 10****** 10****** 10****** 
.............................................
       ..............................................

明白了没有?
编码的方法是从低位到高位

现在就让我们来看看实例吧!

 黄色为标志位
其它着色为了显示其,编码后的位置

Unicode十六进制

Unicode二进制

UTF8二进制

UTF8十六进制

UTF8字节数

B

00001011

00001010

B

1

9D

00010011101

11000010 10011101

C2 9D

2

A89E

10101000 10011110

11101010 10100010 10011110

EA A2 9E

3


4楼 2009年8月23日 14:53:27 米娅
按:这是我写的函数,效果见www.coolder.com。
/*
$str_cut 原始字符串
$length 要留下的按英文字符算的个数,比如相当于28个英文字符的宽度,就写28
*/

function word_trc($str_cut,$length)
{
$i=0;
$k=0;
while ($k<=$length)
{
if(ord($str_cut[$i])< 128)
{
$i++;
$k++;
}
else
{
$i=$i+3;
$k=$k+1.8; //这里按2个汉字字符相当于2.8个英文字符的宽度计算
}
}
if(strlen($str_cut)>$i)
$str_cut = substr($str_cut,0,$i). "...";
else
$str_cut = substr($str_cut,0,$i);
return $str_cut;
}

5楼 2010年3月4日 21:28:04 米娅
再配上<td nowrap="nowrap"> 让每行的文本不换行,就接近完美了。
第1页 共1页
相关链接