- 浏览: 555550 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (233)
- CSS (12)
- J2SE学习 (16)
- J2EE (6)
- JavaScript (38)
- Struts 1.x (2)
- SQL (9)
- Hibernate (5)
- TYPO3 (1)
- Mysql (10)
- Drupal (14)
- 生活 (10)
- PHP (40)
- Linux (15)
- 口语 (2)
- Magento (8)
- Dotnet (2)
- 正则 (2)
- Android ADB shell (1)
- Android (7)
- HTTP (4)
- Android API (2)
- eclipse (1)
- JAVA (4)
- 数据结构 (3)
- 集合 (1)
- IoC(反向控制) (2)
- 设计模式 (3)
- WebView (2)
- 算法 (6)
- smsniff (1)
- VIM (7)
- iOS (4)
- gcc (2)
- xcode (1)
- Mac (5)
- opencv (3)
- cmake (2)
- git (1)
- html5 (1)
- audio (1)
- apache (3)
- shell (1)
- 工作感悟 (1)
最新评论
-
jiyilee:
的确,不少命令都不能用,不方便啊。。
Apple:如何在iphone、ipad上安装一些常用命令行命令 -
idong杨:
[url][url][url][url][url][/url] ...
php中将SimpleXMLElement Object数组转化为普通数组 -
idong杨:
...
php中将SimpleXMLElement Object数组转化为普通数组 -
wcily123:
递归删除指定目录下的.git文件find . -name .g ...
Linux上批量删除.svn目录 -
yilinsitian:
受教了,好像Socket通信超时机制 还没有说吧
Android·HTTP超时机制
UTF-8编码问题编码长度问题
UTF-8经常被用于文本文件和网络传输,因为不少这类场合还停留在ANSI时代,需要向纯ASCII兼容。UTF-8是UNICODE的一种变长字符编码 ,长度在1至6字节。这里注意一下,UTF-8曾经是6字节,现在是4字节, 两者都对。 但如果你看到介绍UTF-8的文章说是6字节,基本可以判断这是比较早的文章。在 内容只是ASCII的0X00~0X7F时,UTF-8与ASCII或各种ANSI编码(如GB,JISKSC,ISO-8859-1)的ASCII部分 完全兼容,也是用1字节的低7位表示。这就保证文本编辑器打开的UTF-8格式文档中,即使扩展字符无法显示,但ASCII部分肯定得以顺利解读。这点对 于还需要假定是各种ANSI编码的场合非常有用,比如HTML,前面的纯ASCII部分一直到META标记,然后可以确定随后的编码,而此时UTF-16 则不能正常工作。UTF-8采用如下所示的二进制方式来表示31位UCS-4,X表示有效位:
1字节 0XXXXXXX
2字节 110XXXXX 10XXXXXX
3字节 1110XXXX 10XXXXXX 10XXXXXX
4字节 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
5字节 111110XX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX
6字节 1111110X 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX
从上可以看得出,如果处在第一字节的引导字节最高位为0,则是一字节。否则看前导1的个数,来确定是几个字节长。前导1与有效位之间有0相隔,也可以通过首字节的值范围来确定字节数。
1字节 0 ~127
2字节 192~223
3字节 224~239
4字节 240~247
5字节 248~251
6字节 252~253
随后的字节每个都以10为前导位,取值范围则在128~191之间。可以立即得知一个字节是否为后续字节,因为引导字节的引导位不是00、01就是11,不会是10。
截取8个字符:
字符串:stefan²º¹³
字节数:14
字符数:10
01110011
01110100
01100101
01100110
01100001
01101110
11000010
10110010
11000010
10111010
11000010
10111001
11000010
10110011
错误的:
字符串:stefan�0
字节数:10
字符数:8
01110011
01110100
01100101
01100110
01100001
01101110
11101111
10111111
10111101
00110000
正确的:
字符串:stefan²º
字节数:10
字符数:8
01110011
01110100
01100101
01100110
01100001
01101110
11000010
10110010
11000010
10111010
涉及到相关代码:
UTF-8经常被用于文本文件和网络传输,因为不少这类场合还停留在ANSI时代,需要向纯ASCII兼容。UTF-8是UNICODE的一种变长字符编码 ,长度在1至6字节。这里注意一下,UTF-8曾经是6字节,现在是4字节, 两者都对。 但如果你看到介绍UTF-8的文章说是6字节,基本可以判断这是比较早的文章。在 内容只是ASCII的0X00~0X7F时,UTF-8与ASCII或各种ANSI编码(如GB,JISKSC,ISO-8859-1)的ASCII部分 完全兼容,也是用1字节的低7位表示。这就保证文本编辑器打开的UTF-8格式文档中,即使扩展字符无法显示,但ASCII部分肯定得以顺利解读。这点对 于还需要假定是各种ANSI编码的场合非常有用,比如HTML,前面的纯ASCII部分一直到META标记,然后可以确定随后的编码,而此时UTF-16 则不能正常工作。UTF-8采用如下所示的二进制方式来表示31位UCS-4,X表示有效位:
1字节 0XXXXXXX
2字节 110XXXXX 10XXXXXX
3字节 1110XXXX 10XXXXXX 10XXXXXX
4字节 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
5字节 111110XX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX
6字节 1111110X 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX 10XXXXXX
从上可以看得出,如果处在第一字节的引导字节最高位为0,则是一字节。否则看前导1的个数,来确定是几个字节长。前导1与有效位之间有0相隔,也可以通过首字节的值范围来确定字节数。
1字节 0 ~127
2字节 192~223
3字节 224~239
4字节 240~247
5字节 248~251
6字节 252~253
随后的字节每个都以10为前导位,取值范围则在128~191之间。可以立即得知一个字节是否为后续字节,因为引导字节的引导位不是00、01就是11,不会是10。
截取8个字符:
字符串:stefan²º¹³
字节数:14
字符数:10
01110011
01110100
01100101
01100110
01100001
01101110
11000010
10110010
11000010
10111010
11000010
10111001
11000010
10110011
错误的:
字符串:stefan�0
字节数:10
字符数:8
01110011
01110100
01100101
01100110
01100001
01101110
11101111
10111111
10111101
00110000
正确的:
字符串:stefan²º
字节数:10
字符数:8
01110011
01110100
01100101
01100110
01100001
01101110
11000010
10110010
11000010
10111010
涉及到相关代码:
mb_internal_encoding("UTF-8"); $t = "stefan²º¹³"; $t = "绝望的奥特曼绝望的奥特曼"; //$t = "stefan�0"; //$t = mb_substr($t, 0, 8); $t = my_substr($t, 2, 8); echo "字符串:" . $t . "\n"; echo "字节数:" . strlen($t) . "\n"; echo "字符数:" . mb_strlen($t) . "\n"; $len = strlen($t); for($i=0;$i<$len;$i++) { $bin = decbin(ord($t[$i])); for($j=8;$j>strlen($bin);$j--) { echo '0'; } echo $bin . "\n"; } //自定义utf8截取函数 function my_substr($str, $start, $len) { $cur_len = 0; $sub_len = 0; $new_str = ''; $str_len = strlen($str); for($i=0;$i<$str_len;) { $dec = ord($str[$i]); $byte_len = 1; if($dec<=127) { $byte_len = 1; } else if($dec>=192 && $dec<=223) { $byte_len = 2; } else if($dec>=224 && $dec<=239) { $byte_len = 3; } else if($dec>=240 && $dec<=247) { $byte_len = 4; } else if($dec>=248 && $dec<=251) { $byte_len = 5; } else if($dec>=252 && $dec<=253) { $byte_len = 6; } else { // 异常 $i++; continue; } for($j=$byte_len;$j>0;$j--) { if($cur_len>=$start) { $new_str .= $str[$i]; } $i++; } if($cur_len>=$start) { $sub_len++; } $cur_len++; if($sub_len>=$len) { break; } } return $new_str; }
发表评论
-
Linux 快速安装 LAMP环境
2012-08-20 11:47 5017Linux 快速安装 LAMP环境 #检查一下系统更新 ... -
在命令行下运行 PHP 脚本
2012-08-10 19:06 1016<?php fwrite(STDOUT, &quo ... -
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
2012-08-10 15:26 1332POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的 ... -
深入理解ob_flush和flush的区别
2012-08-09 15:45 1081[转] http://www.laruence.com/201 ... -
[转]OS X Mountain Lion 系统配置 Apache+Mysql+PHP 详细教程
2012-08-09 11:49 1166OS X Mountain Lion 系统配置 ... -
PHP file_get_contents 获取请求返回头信息
2012-07-06 19:57 4560PHP file_get_contents 获取请求返回头信息 ... -
vim lookupfile插件tagfile 生成
2012-06-04 09:29 2272<?php /** 命令 :l ... -
php中将SimpleXMLElement Object数组转化为普通数组
2012-02-27 18:22 33344php中将SimpleXMLElement Object数组转 ... -
PHP 修改HTTP头 --Modify HTTP Headers
2011-11-25 11:50 1674Modify HTTP Headers // See rel ... -
Redis 常用命令 (php)
2011-05-28 13:25 2538Redis常用命令一 2011年05 ... -
一道很纠结的php面试题
2011-04-27 14:22 966$a = 1; $b = 'a'; $a = ... -
PHP的小技巧[转]
2011-04-26 14:00 850PHP的小技巧 好象,大多时候,我们对于字符串的比较都是采用 ... -
服务器状态代码含义
2011-04-25 01:36 812服务器状态代码含义 ... -
$_SERVER变量的中文翻译
2011-04-25 00:59 1002服务器变量 $_SERVER 详解: 1、$_SESSION ... -
何为RBAC
2011-04-24 22:18 1319角色访问控制(RBAC)引入了Role的概念,目的是为了隔离U ... -
PHP负载均衡
2011-04-24 22:07 877过去当运行一个大的web应用时候意味着运行一个大型的web服务 ... -
PHP去除数组中的空值
2011-04-24 21:17 1183foreach( $arr as $k=>$v){ ... -
PHP 中的stdClass概述
2011-04-24 20:43 827很多php程序员用它来传递一系列变量的值,而同时又懒得去创建一 ... -
PHP字符串三种定义方式
2011-04-24 20:12 6866PHP的字符串有三种定义方式:单引号 、双引号 、定界符 ... -
PHP中str_replace函数的详解 [转 ]
2011-04-24 17:46 935在实际的程序开发中,执行字符串替换操作是一件非常经常的事,对s ...
相关推荐
很多人喜欢用CString 或std:string,但是他们的缺点是不能完成汉字各种类型之间的转换,提供三种类库ascString,ucsString,utfString以及工具utfCount,utf8_ucs2_t,tcf8_ucs4_t类库,用于各种字符串之间的直接转换`...
}UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码Unicode字符。用在网页上可以统一...
一、介绍 UTF-8 是一种在web应用中经常使用的一种 Unicode 字符的编码方式,使用 UTF-8 的好处在于它是一种变长的编码方式,对于 ANSII 码编码长度为1个字节,这样的话在传输大量 ASCII 字符集的网页时,可以大量...
UTF-8toGB2312分享一个UTF-8转GB2312函数(UTF-8toGB2312)思路是UTF-8->Unicode->GB2312cp936.h是Unicode->GB2312的字符表void Utf8ToGb2312(const char* utf8, int len,u16* gbArray);参数:utf8是uft-8的字符串len...
修正以utf-8返回BSTR字符内容时长度偏少的错误。
数据视图UTF-8 用于将ArrayBuffer转换为utf-8字符串的Javascript方法如何使用? 您将必须在项目中添加utf8.js文件。 我假设您已经从websocket或ajax输入了缓冲区var dataview = new DataView(buffer); dataview....
javascript的字符集: javascript程序是使用Unicode字符集编写的。...UTF-8(UTF8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。 它可以用来表示Unicode标准中的任何字
UTF-8 互联网的普及, 强烈要求出现一种统一的编码方式. UTF-8就是在互联网上使用最广的一种unicode的实现方式. 其他实现方式还包括UTF-16和UTF-32, 不过在互联网上基本不用. ... 因此对于英语字母, UTF-8编码和ASCI
复制代码 代码如下://截取字符串长度。支持utf-8和gb2312编码...=’utf-8′){//总是将字符串转为utf-8编码 $str=iconv($code,’utf-8′,$str); } $str_len=mb_strlen($str,’utf-8′);//字符串的长度 if($from>$str_le
截取文字长度函数,支持UTF-8 ,这样就可以满意大部分截取字符串的朋友了。
对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是1~3倍的差异了。 采用PHP字符串mbstring可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于...
UTF-8编码是一种可变长度的编码方式,它可以使用1到4个字节来表示一个字符。UTF-8编码是Unicode字符集的一种实现方式,它可以表示世界上所有的字符,包括中文、日文、韩文等。在Python3中,UTF-8编码可以通过使用...
utf-8 是一种在web应用中经常使用的一种 unicode 字符的编码方式,使用 utf-8 的好处在于它是一种变长的编码方式,对于 ANSII 码编码长度为1个字节,这样的话在传输大量 ASCII 字符集的网页时,可以大量节约网络带宽...
PHP中文分词代码使用居于unicode的词库,使用反向匹配模式分词,理论上兼容编码更广泛,并且对utf-8编码尤为方便。由于PhpanAlysis是无组件的系统,因此速度会比有组件的稍慢,不过在大量分词中,由于边分词边完成...
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,由Ken Thompson于1992年创建,现在已经标准化为RFC 3629。UTF-8用1到4个字节编码Unicode字符。用在网页上可以统一页面显示中文...
计算机基础知识-编码表 模块:计算机基础知识 主题:编码表 关键词:ASCII、Unicode、UTF-8 1、编码表 计算机发明之初,用来解决数字计算的问题,后来人们发现可以做更多的事,但由 于计算机只识" 数",因此人们必须...
简介:UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,由Ken Thompson于1992年创建,现在已经标准化为RFC 3629。UTF-8用1到4个字节编码Unicode字符。
我们知道有时候使用substr来截取UTF-8中文字符串的时候,经常会出现乱码,为什么会出现这样的问题呢,本文告诉你答案。看这样一段代码吧(字符编码为UTF-8): 复制代码 代码如下:<?$str = ‘都知道strlen与mb_...