检测字节流是否是UTF8编码】的更多相关文章

几天前偶尔看到有人发帖子问“如何自动识别判断url中的中文参数是GB2312还是Utf-8编码” 也拜读了wcwtitxu使用巨牛的正则表达式检测UTF8编码的算法. 使用无数或条件的正则表达式用起来却是性能不高. 刚好曾经在项目中有类似的需求,这里把处理思路和整理后的源代码贴出来供大家参考 先聊聊原理: UTF8的编码规则如下表 看起来很复杂,总结起来如下: ASCII码(U+0000 - U+007F),不编码 其余编码规则为 •第一个Byte二进制以形式为n个1紧跟个0 (n >= 2),…
/** * 检测字符串是否为UTF8编码 * @param string $str 被检测的字符串 * @return boolean */ function is_utf8($str){ $len = strlen($str); for($i = 0; $i < $len; $i++){ $c = ord($str[$i]); if ($c > 128) { if (($c > 247)) return false; elseif ($c > 239) $bytes = 4; e…
如两个URL字符串: &q=%E8%A3%99%E5%AD%90&style=grid&seller_type=taobao &q=%CE%D0%C2%D6%D4%F6%D1%B9&style=list&s=44; 上面有uft-8编码,下面的用gb2312编码,但是怎么自动识别呢? 参考csdn论坛讨论,解决方法有两种: 不管它是utf-8,还是 gbk, 还是.... 先按 iso-8859-1 解码 然后用正则 匹配一下看是否全文符合 utf-8 规则…
在PHP检测字符串是否是UTF-8编码的时候,很多人在使用mb_detect_encoding的时候,经常遇到检测不准的问题,下面的方法可以准确检测编码是否是UTF-8 function check_utf8($str) { $len = strlen($str); for($i = 0; $i < $len; $i++){ $c = ord($str[$i]); if ($c > 128) { if (($c > 247)) return false; elseif ($c >…
  Response.Charset = "UTF-8"; Response.ContentEncoding = Encoding.UTF8; Response.AppendHeader($"Content-Disposition", "attachment;filename=coupons.xls"); //Response.AppendHeader("Content-Disposition", "attachme…
> 参考的优秀文章 1.十分钟搞清字符集和字符编码 2.Java中byte与16进制字符串的互相转换 3.[异常处理]Incorrect string value: '\xF0\x90\x8D\x83...' for column... Emoji表情字符过滤的Java实现 4.Why a surrogate java regexp finds hypen-minus > 如何检测.替换4个字节的utf-8编码(此范围编码包含emoji) 项目有个需求,是保存从手机端H5页面提交的信息. 大家…
Posted on 2011-05-14 所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32),如果出现在文本中间,则解释为zero width no-break space. 注:Unicode相关知识的详细介绍请参考UTF-8, UTF-16, UTF-32 & BOM. 对于UTF-8/16/32而言,它们名字中的8/16/32指的是编码单位…
C/C++程序中,locale(即系统区域设置,即国家或地区设置)将决定程序所使用的当前语言编码.日期格式.数字格式及其它与区域有关的设置,locale设置的正确与否将影响到程序中字符串处理(wchar_t如何输出.strftime()的格式等).因此,对于每一个程序,都应该慎重处理locale设置. C locale和C++ locale是独立的.C locale用setlocale(LC_CTYPE, “”)初始化,C++ locale用std::locale::global(std::lo…
介绍UTF-8编码规则 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-0…
UTF-8编码方式与字节序标记 一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基于ASCII.面向字节的字符处理的需要,Unicode标准中定义了UTF-8编码方式.UTF-8应该是目前应用最广泛的一种Unicode编码方式(但不是最早面世的,UTF-16要早于UTF-8面世).它是一种使用8位码元(即单字节码元)的变宽(即变长或不定长)码元序列的编码方式. 由于UTF-16对…
from : http://blog.csdn.net/baixiaoshi/article/details/40786503 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节". 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出更多的状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"计算机". 开始计算机只在美国用.…
近来接到一个小项目,读取目标文件中每一行url,并逐个请求url,拿到想要的数据. #-*- coding:utf-8 -*- class IpUrlManager(object): def __init__(self): self.newipurls = set() #self.oldipurls = set() def Is_has_ipurl(self): return len(self.newipurls)!=0 def get_ipurl(self): if len(self.newi…
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码.由Ken Thompson于1992年创建.现在已经标准化为RFC 3629.UTF-8用1到4个字节编码Unicode字符.用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文). <?php /** *检查字符串是否是utf8编码 *@param string $string 被检测字符串 *@return Boolean */ function i…
我们最初学习计算机的时候,都学过ASCII编码. 但是为了表示各种各样的语言,在计算机技术的发展过程中,逐渐出现了很多不同标准的编码格式, 重要的有Unicode.UTF.ISO-8859-1和中国人经常使用的GB2312.BIG5.GBK等. 1.编码基础知识 最早的编码是iso8859-1,和ascii编码相似.但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个. 1.1. ISO-8859-1 通常叫做Latin-1 属于单字节编码,最多能表示的字符范围是0-255,应…
本文利用JDK中的BufferedReader和BufferedWriter实现将任何编码方式的txt文件以UTF-8编码方式转存. UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码,由Ken Thompson于1992年创建.现在已经标准化为RFC 3629.UTF-8用1到6个字节编码Unicode字符.用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文).UTF-8最大的优势是可以避…
原文:http://blog.csdn.net/54powerman/article/details/77575656 作者:54powerman 一直以为,java中任意unicode字符串,可以使用任意字符集转为byte[]再转回来,只要不抛出异常就不会丢失数据,事实证明这是错的. 经过这个实例,也明白了为什么 getBytes()需要捕获异常,虽然有时候它也没有捕获到异常. 言归正传,先看一个实例. 用ISO-8859-1中转UTF-8数据 设想一个场景: 用户A,有一个UTF-8编码的字…
何为GBK,何为GB2312,与区位码有何渊源? 区位码是早些年(1980)中国制定的一个编码标准,如果有玩过小霸王学习机的话,应该会记得有个叫做“区位”的输入法(没记错的话是按F4选择).就是打四个数字然后就出来汉字了,什么原理呢.请看下面的区位码表,每一个字符都有对应一个编号.其中前两位为“区”,后两位为“位”,中文汉字的编号区号是从16开始的,位号从1开始.前面的区号有一些符号.数字.字母.注音符号(台).制表符.日文等等. 而GB2312编码就是基于区位码的,用双字节编码表示中文和中文符…
转自 http://blog.csdn.net/zcmssd/article/details/6086649 是由于输出的CSV文件中没有BOM. 什么是BOM? 在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中.UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”.这样如果接收者收到FEFF,就表明这个字节流是Big-Endia…
字符集错误转换导致的问题 UTF-8格式编码的字节流,按GBK字符集转换为字符串,会出现乱码,这很正常.但将其重新转为字节流,再用UTF-8字符集转为字符串,还是乱码.这就让我产生了疑惑,虽然使用错误的字符集必然导致乱码,但字节的信息并没有改变,因此再转为字节流,用正确的字符集解码,应该得到正常的字符串.但事实是,被错误字符集转换过的字符串,无法恢复到原来的字符集. 问题的根本原因 造成该问题的根源是字节发生了变化.GBK或UTF-8遇到无法解析的字符时,会使用特殊的字符代替,因此造成原有字节信…
什么是BOM? 在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中.UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”.这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的:如果收到FFFE,就表明这个字节流是Little- Endian的.因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BO…
UTF-8是UNICODE的一种变长度的编码表达方式<一般UNICODE为双字节(指UCS2)>,它由Ken Thompson于1992年创建,现在已经标准化为RFC 3629.UTF-8就是以8位为单元对UCS进行编码,而UTF-8不使用大尾序和小尾序的形式,每个使用UTF-8存储的字符,除了第一个字节外,其余字节的头两个位都是以"10"开始,使文字处理器能够较快地找出每个字符的开始位置. 但为了与以前的ASCII码兼容(ASCII为一个字节),因此UTF-8选择了使用可…
最近在给项目团队开发一个基于 Java 的通用的 XML 分析器时,设计了一个方法,能够读取现成的 XML 文件进行分析处理,当然 XML 都是采用 UTF-8 进行编码的.但是在用 UltraEdit 写了一个测试用的 UTF-8 XML 文件后,程序在读取该文件时发生错误: Parse Fatal Error at line 1 column 1: 前言中不允许有内容.org.xml.sax.SAXParseException: Content is not allowed in prolo…
注意:乱码和request的具体实现类有关,现在已经查到的是RequestDispatcher.forward调用前使用的是org.apache.catalina.connector.RequestFacade类而RequestDispatcher.forward调用后使用的是org.apache.catalina.core.ApplicationHttpRequest,他们内部在ParseParameter的时候, 用来解码的默认的编码逻辑不同,使用不同的协议时,影响乱码的因素不同! 具体参考…
当从http 的response输出CSV文件的时候,设置为utf8的时候默认是不带bom的,可是windows的Excel是使用bom来确认utf8编码的,全部须要把bom写到文件的开头. 微软在 UTF-8 中使用 BOM 是由于这样能够把 UTF-8 和 ASCII 等编码明白区分开.否则用Excel打开CSV文件有可能是乱码的演示样例代码例如以下:response.setContentType("text/csv");response.setHeader("Conte…
        Unicode规范中有一个BOM的概念.BOM——Byte Order Mark,就是字节序标记.在这里找到一段关于BOM的说明: 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中.UCS规范建议我们在传输字节流前,先传输 字符"ZERO WIDTH NO-BREAK SPACE".这样如果接收者收到FEFF,就表明这个字节流是B…
BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE“的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中. UCS规范建议我们在传输字节流前,先传输 字符”ZERO WIDTH NO-BREAK SPACE“. 如果接收者收到FEFF,就表明这个字节流是大字节序的:如果收到FFFE,就表明这个字节流是小字节序的.因此字符”ZERO WIDTH NO-BREAK SPACE“…
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"***"就可以了.对于子串的查找,就KMP算法就可以了.但是敏感词这么多,总不能一个一个地遍历看看里面有没有相应的词吧! 于是我想到了前几天写的字典树.如果把它改造一下,并KMP算法结合,似乎可以节约不少时间. 首先说明一下思路: 对于KMP算法,这里不过多阐述.对于敏感词库,如果把它存进字典树,并在…
前台的字符串传递到后台进行处理,发现了一个较诡异的问题:字符串中的一个空格(ASCII:32)被UTF-8编码之后变成了一个诡异的字符(ASCII:194 和 160的组合)!但在后台其表象还是空格. 在UTF-8编码里面存在一个特殊的字符,其编码是"0xC2 0xA0",转换成字符的时候表现为一个半角空格,跟一般的半角空格(ASCII 0x20)不同的是它的宽度不会被压缩,所以排版中常能用到它.但是GB2312.Unicode之类并没有这样的字符,所以转换后前台会显示为"?…
问题描述 原来字串内容name为下面内容: ######name=杨乃文做DJ,微信公众号FunRadio.什么样的姿态是小丑姿态?2016046###### 需要截取成大小为64的name_rm[64]的数组内容,出现如下乱码: ######name=杨乃文做DJ,微信公众号FunRadio.什么样的姿态斣##### 问题分析 UTF-8编码,汉字占3个字节,英文占一个字节,标点符号占领3个字节. 汉子:15*3=45 英文:10*1=10 标点符号:2*3=6   共61,64-61=3还可…
from:http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所以可以看出unicode是给出一个字符的范围,定义了这个字是码值是多少,至于具体的实现方式可以有多种多样来实现. UTF-8是一种变长字节编码方式.对于某一…