当前位置:文档之家› linux 宽字符与多字节字符之间的转换

linux 宽字符与多字节字符之间的转换

linux 宽字符与多字节字符之间的转换
linux 宽字符与多字节字符之间的转换

linux 宽字符与多字节字符之间的转换

2008-07-17 09:411237人阅读评论(0)收藏举报最近再调linux下证书验证问题,由于要对客户端发送过来的证书在服务器上与根证书进行认证,所以在读取证书、验证证书时设计到了编码转换问题。在windows下,使用MultiByteToWideChar和WideCharT oMultiByte没有问题,但在linux下,不存在这两个函数,于是我们想到了用wcstombs和mbstowcs两个函数,但经试验,不能得到正确的结果,后来,经分析,得到,在windows下wchar_t为2字节,而在linux wchar_t为4字节,我们提取的证书编码为2字节的宽字符,所以不能正确地进行转换。不得不,只能使用libiconv 进行转换。

iconv函数族的头文件是iconv.h。

#include

iconv函数族有三个函数,原型如下:

(1) iconv_t iconv_open(const char *tocode, const char *fromcode);

此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。

(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t

*outbytesleft);

此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。(3) int iconv_close(iconv_t cd);

此函数用于关闭转换句柄,释放资源。

经过测试,使用这转换函数需要注意的有以下几点:

1、宽字节存在big-endian和little-endian之分,那使用宽字符编码时使用的编码名字也不一样,例如我们用的UCS-2编码,那有“UCS-2”和“UCS-2-INTERNAL”之分;

2、iconv中的两个长度在运行完函数后,分别为分配缓存剩余字节的大小;

3、而两个指针分别指向转换后字符串的尾部,所以在进行转换之前,应该保留缓存的原始指针,在转换后,用这两个指针减去原始指针,那就是已转换的字节长度和转换后的字节长度。

下面是我测试的代码,程序写的不怎么考究,呵呵!

#include

#include

#include

#include

#include

#define BUFLEN 200

char outBuf[BUFLEN];

//char inBuf[BUFLEN]="CN";

char inBuf[BUFLEN]="/x43/x00/x4e/x00/x00/x00";

//char inBuf[BUFLEN]="/x7a/x7a/x51/x9b/x00/x00";

int main(){

char *pIn = inBuf;

char *pOut = outBuf;

iconv_t cd;

int inLen = 4, outLen = BUFLEN;

int retSize = 0;

cd = iconv_open("UTF-8","UCS-2-INTERNAL");

// cd = iconv_open("UCS-2-INTERNAL","UTF-8");

if ((iconv_t)-1 == cd){

printf("Donot support this convert../n");

return -1;

}

if ((size_t)-1 == (retSize= iconv(cd, &pIn, (size_t *)&inLen, &pOut,(size_t

*)&outLen))){

if (E2BIG == errno)

printf(" E2BIG errno %d/n", errno);

if (EILSEQ == errno)

printf("EILSEQ errno %d/n", errno);

if (EINVAL == errno)

printf("EINVAL errno %d/n", errno);

printf("convert WCHAR to multi error/n");

return -1;

}

if (outLen > 0){

printf("/n/n outBuf:");

int i = 0;

for (i = 0; i < 200; i++){

printf("%02x ", outBuf[i]);

}

printf("/n/n inBuf:");

for (i = 0; i < 200; i++){

printf("%02x ", inBuf[i]);

}

printf("/n/n");

}

printf("out buf: %s outLen: %d retSize: %d inLen: %d/n", pOut, outLen, retSize, inLen);

printf("pInbuf: %s/n", pIn);

iconv_close(cd);

return 0;

}

字符编码的转换

C++字符串完全指南- Win32字符编码(一) 前言 字符串的表现形式各异,象TCHAR,std::string,BSTR等等,有时还会见到怪怪的用_tcs起头的宏。这个指南的目的就是说明各种字符串类型及其用途,并说明如何在必要时进行类型的相互转换。 在指南的第一部分,介绍三种字符编码格式。理解编码的工作原理是致为重要的。即使你已经知道字符串是一个字符的数组这样的概念,也请阅读本文,它会让你明白各种字符串类之间的关系。 指南的第二部分,将阐述各个字符串类,什么时候使用哪种字符串类,及其相互转换。 字符串基础 - ASCII, DBCS, Unicode 所有的字符串类都起源于C语言的字符串,而C语言字符串则是字符的数组。首先了解一下字符类型。有三种编码方式和三种字符类型。 第一种编码方式是单字节字符集,称之为SBCS,它的所有字符都只有一个字节的长度。ASCII码就是SBCS。SBCS字符串由一个零字节结尾。 第二种编码方式是多字节字符集,称之为MBCS,它包含的字符中有单字节长的字符,也有多字节长的字符。Windows用到的MBCS只有二种字符类型,单字节字符和双字节字符。因此Windows中用得最多的字符是双字节字符集,即DBCS,通常用它来代替MBCS。 在DBCS编码中,用一些保留值来指明该字符属于双字节字符。例如,Shift-JIS(通用日语)编码中,值 0x81-0x9F 和 0xE0-0xFC 的意思是:“这是一个双字节字符,下一个字节是这个字符的一部分”。这样的值通常称为前导字节(lead byte),总是大于0x7F。前导字节后面是跟随字节(trail byte)。DBCS的跟随字节可以是任何非零值。与SBCS一样,DBCS字符串也由一个零字节结尾。 第三种编码方式是Unicode。Unicode编码标准中的所有字符都是双字节长。有时也将Unicode称为宽字符集(wide characters),因为它的字符比单字节字符更宽(使用更多内存)。注意,Unicode不是MBCS - 区别在于MBCS编码中的字符长度是不同的。Unicode字符串用二个零字节字符结尾(一个宽字符的零值编码)。

常用字符集介绍和编码转换原理

常用字符集介绍和编码转换原理 目录 1. GB2312编码介绍 (2) 1.1 基本信息 (2) 1.2 GB标准 (2) 1.3 分区表示 (2) 1.4 字节结构 (2) 2. 通用字符集UCS (3) 2.1 定义 (3) 2.2 概要 (3) 2.3 实现级别 (3) 2.4 与UNICODE的兼容关系 (3) 3. unicode编码介绍 (3) 3.1 基本简介 (4) 3.2 编码实现 (4) 3.2.1 编码方式 (4) 3.2.2 实现方式 (5) 4. UTF-8介绍 (5) 4.1 基本介绍 (5) 4.2 编码原理 (5) 4. 转换原理 (7)

1. GB2312编码介绍 1.1 基本信息 1.2 GB标准 GB2312或GB2312-80是一个简体中文字符集的中国国家标准,全称为《信息交换用汉字编码字符集·基本集》,又称为GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。 GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。 GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。 对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。 1.3 分区表示 GB 2312中对所收汉字进行了―分区‖处理,每区含有94个汉字/符号。这种表示方式也称为区位码。 01-09区为特殊符号。 16-55区为一级汉字,按拼音排序。 56-87区为二级汉字,按部首/笔画排序。 10-15区及88-94区则未有编码。 举例来说,―啊‖字是GB2312之中的第一个汉字,它的区位码就是1601。 1.4 字节结构

Unicode、UTF-8与GB2312等编码之间是如何转换的

字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?(... 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识。不注意的人可能对这个不在意,但这些名词有时候实在让人迷惑,对想学习计算机知识的人来说,搞懂它也十分重要,我也是在学习中慢慢了解了一些这方面的知识。 1. ASCII码 在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。 ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(十进制的32,用二进制表示就是00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。下面是截图:具体的可以到这个网页上去查下: 2、非ASCII编码 英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。 但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表

C++编译器对字符串的编码转换

C++编译器对字符串的编码转换 殷海峰 2012年07月20日

变更记录 日期作者说明2012.07.18 殷海峰完成初稿 2012.07.20 殷海峰增加了如下内容 1、研究方法; 2、MinGW gcc 处理 Unicode 字符串; 3、VC++6.0处理rc文件里的字符串; 4、VC++.NET对字符串的处理 I

目录 第1章说明 (3) 1.1 前言 (3) 1.2 MinGW gcc (3) 1.2.1 ANSI字符串 (3) 1.2.2 Unicode字符串 (4) 1.2.3 #include (4) 1.3 VC++6.0 (4) 1.3.1 ANSI字符串 (5) 1.3.2 Unicode字符串 (5) 1.3.3 资源文件 (5) 1.4 VC++.NET (5) II

第1章说明 1.1 前言 本文将研究C++编译器对字符串的编码转换。如下面两行代码包含了一个ANSI字符串和一个Unicode字符串(也叫Wide字符串)。编译之后,它们具体的编码是什么? const char* pA = "123456789测试"; //ANSI字符串 const wchar_t* pW = L"123456789测试"; //Unicode字符串 使用UltraEdit以二进制打开编译生成的exe文件。找到123456789之后就可以查看ANSI字符串中“测试”的编码;找到16进制字符串 31 00 32 00 33 00 34 00 35 00就可以查看Unicode字符串中“测试”的编码。使用这个方法,本文对 MinGW gcc 和 VC++ 编译器进行了研究。 1.2 MinGW gcc 在 Windows 系统下,安装Qt Creator 2.3.1 之后,MinGW 4.4.0就被自动安装,其安装目录一般位于:C:\Qt\qtcreator-2.3.1\mingw。 1.2.1 ANSI字符串 MinGW gcc 4.4.0编译器对ANSI字符串的编码原则:保持其在源文件里的原始编码,不做任何转换。 举例说明:对于Test.cpp里的字符串"测试"。如果Test.cpp的编码是ANSI 的,则"测试"就是ANSI编码;如果Test.cpp的编码是UTF-8的,则"测试"就是UTF-8编码。编译器生成exe的时候,仅仅在它们后面增加一个字符'\0'。也就是说同样的字符串"测试",会因为Test.cpp的编码不同而不同。同样的代码s trlen("测试"),会因为Test.cpp的编码不同而返回不同的值。 了解了这个原理,下面来看两行QT代码: 3

sql to_char 日期转换字符串

1、转换函数 与date操作关系最大的就是两个转换函数:to_date(),to_char() to_date() 作用将字符类型按一定格式转化为日期类型: 具体用法:to_date('2004-11-27','yyyy-mm-dd'),前者为字符串,后者为转换日期格式,注意,前后两者要以一对应。 如;to_date('2004-11-27 13:34:43', 'yyyy-mm-dd hh24:mi:ss') 将得到具体的时间 多种日期格式: YYYY:四位表示的年份 YYY,YY,Y:年份的最后三位、两位或一位,缺省为当前世纪 MM:01~12的月份编号 MONTH:九个字符表示的月份,右边用空格填补 MON:三位字符的月份缩写 WW:一年中的星期 D:星期中的第几天 DD:月份中的第几天 DDD:年所中的第几天 DAY:九个字符表示的天的全称,右边用空格补齐 HH,HH12:一天中的第几个小时,12进制表示法 HH24:一天中的第几个小时,取值为00~23 MI:一小时中的分钟 SS:一分钟中的秒 SSSS:从午夜开始过去的秒数 to_char():将日期转按一定格式换成字符类型 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time from dual; TIME ------------------- 2004-10-08 15:22:58 即把当前时间按yyyy-mm-dd hh24:mi:ss格式转换成字符类型 在oracle中处理日期大全 TO_DATE格式 Day: dd number 12 dy abbreviated fri day spelled out friday ddspth spelled out, ordinal twelfth Month: mm number 03

各种字符编码间的转换方法:MultiByteToWideChar和MultiByteToWideChar

MultiByteToWideChar和MultiByteToWideChar对各种字符编码间的转换 函数原型: int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar ); 此函数把宽字符串转换成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字节字符集。参数: CodePage:指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。 参数说明: 1、CodePage——指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,可选择以下代码页: CP_ACP //当前系统ANSI代码页 CP_MACCP //当前系统Macintosh代码页 CP_OEMCP //当前系统OEM代码页,一种原始设备制造商硬件扫描码CP_SYMBOL //Symbol代码页,用于Windows 2000及以后版本 CP_THREAD_ACP //当前线程ANSI代码页,用于Windows 2000及以后版本 CP_UTF7 //UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL CP_UTF8 //UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL 用GetLocaleInfo 函数获取当前系统的代码页,936: 简体中文, 950: 繁

Excel表格TIME函数轻松将字符转换为时间型数据

不规则数据现在越来常见,从网页上抓取到的列表或文本字符,从数据后台系统导出的字符串数据,如何把这些字符串转化为相应的数据格式并进行运算,看似很小的一个问题,却足以让你为之挠头。 我遇到的应用场景: 从百度统计后台导出的网页访问数据,其中有一列指标为“平均停留时长”,用于统计访客访问某个页面时的阅读时间,很显然这是一串时间数据,互相可以比较大小,并计算平均以及加和等。但实际情况是,导出的excel表格数据,该列为一整串字符,没有办法比较并运算。现在需要这字符串转化为时间型数据。 Excel电子表格的TIME()函数: TIME()函数用途:返回某一特定时间的小数值,它返回的小数值从0 到0.9 9999999之间,代表0:00:00(12:00:00 A.M)到23:59:59(11:59:59 P.M) 之间的时间。 语法:TIME(hour,minute,second)参数:Hour 是0 到23 之间的数,代表小时;Minute 是0 到59 之间的数,代表分;Second是0 到59 之间的数,代表秒。 TIME()函数转化字符串为时间型数据 假设原字符串放在C列,从2行开始往下,其原格式为:00:00:00,分别表示小时、分钟和秒,冒号占用2个字符,该字符串总长度10字符。 1、首先将D列格式调整为自定义:“h”时“m”分“s”秒。

2、在D2单元格输入函数: =TIME(LEFT(C2,2),MID(C2,5,2),RIGHT(C2,2)) 分别嵌套LEFT函数、MID函数和RIGHT函数,表示时、分、秒。确定并向下自动填充。

此时,D列即为可运算的时间格式数据,便于进一步分析。 一些简单实用的Excel函数,对于提高工作效率有莫大帮助,我的博客也会多整理一些并分享。 本文出自数据分析案例,转载时请注明出处及相应链接。

jquery字符编码转换

Ajax遭遇GBK编码(完全解决方案)占个座位先 国内互联网普遍都是使用GBK编码。对于J2EE项目,为了减少编码的干扰通常都是设置一个编码的Filter,强制将Request/Response编码改为GBK。例如一个Spring的常见配置如下: encodingFilter org.springframework.web.filter.CharacterEncodingFil ter encoding GBK forceEncoding true 毫无疑问,这在GBK编码的页面访问、提交数据时是没有乱码问题的。但是遇到Ajax就不一样了。Ajax强制将中文内容进行UTF-8编码,这样导致进入后端后使用GBK进行解码时发生乱码。 如果提交数据的时候能够告诉后端传输的编码信息是否就可以避免这种问题?比如Ajax请求告诉后端是UTF-8,其它请求告诉后端是GBK,这样后端分别根据指定的编码进行解码是不是就解决问题了。 问题: 1.如何通过Ajax告诉后端的编码?Header过于复杂,Cookie成本太高,使 用参数最方便。 2.后端何时进行解码?每一个请求进行解码,过于繁琐;获取参数时解码, 此时已经乱码;在Filter里面动态设置编码是最完善的方案。 3.如何从参数中获取编码?如果是POST的body显然无法获取,因此在获取 之前所有参数就已经按照某种编码解码过了,无法还原。所以通过URL 传递编码最有效。支持GET/POST,同时成本很低。 解决了上述问题,来看具体实现方案。列一段Java代码: import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern;

sql中convert()函数【日期与字符串之间的转换】

CONVERT(data_type,expression[,style]) convert(varchar(10),字段名,转换格式) 说明: 此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar) 相互转换的时候才用到. 语句结果 SELECT CONVERT(varchar(100), GETDATE(), 0) 07 15 2009 4:06PM SELECT CONVERT(varchar(100), GETDATE(), 1) 07/15/09 SELECT CONVERT(varchar(100), GETDATE(), 2) 09.07.15 SELECT CONVERT(varchar(100), GETDATE(), 3) 15/07/09 SELECT CONVERT(varchar(100), GETDATE(), 4) 15.07.09 SELECT CONVERT(varchar(100), GETDATE(), 5) 15-07-09 SELECT CONVERT(varchar(100), GETDATE(), 6) 15 07 09 SELECT CONVERT(varchar(100), GETDATE(), 7) 07 15, 09 SELECT CONVERT(varchar(100), GETDATE(), 8) 16:06:26 SELECT CONVERT(varchar(100), GETDATE(), 9) 07 15 2009 4:06:26:513PM SELECT CONVERT(varchar(100), GETDATE(), 10) 07-15-09 SELECT CONVERT(varchar(100), GETDATE(), 11) 09/07/15 SELECT CONVERT(varchar(100), GETDATE(), 12) 090715 SELECT CONVERT(varchar(100), GETDATE(), 13) 15 07 2009 16:06:26:513 SELECT CONVERT(varchar(100), GETDATE(), 14) 16:06:26:513 SELECT CONVERT(varchar(100), GETDATE(), 20) 2009-07-15 16:06:26 SELECT CONVERT(varchar(100), GETDATE(), 21) 2009-07-15 16:06:26.513 SELECT CONVERT(varchar(100), GETDATE(), 22) 07/15/09 4:06:26 PM SELECT CONVERT(varchar(100), GETDATE(), 23) 2009-07-15 SELECT CONVERT(varchar(100), GETDATE(), 24) 16:06:26

UTF8与GBK字符编码之间的相互转换

UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换CChineseCode 一预备知识 1,字符:字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。 2,字符集:字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集(iso8859-1,GB2312/GBK,unicode)。 3,代码点:字符集中的每个字符都被分配到一个“代码点”。每个代码点都有一个特定的唯一数值,称为标值。该标量值通常用十六进制表示。 4,代码单元:在每种编码形式中,代码点被映射到一个或多个代码单元。“代码单元”是各个编码方式中的单个单元。代码单元的大小等效于特定编码方式的位数:UTF-8 :UTF-8 中的代码单元由8 位组成;在UTF-8 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元;UTF-16 :UTF-16 中的代码单元由16 位组成;UTF-16 的代码单元大小是8 位代码单元的两倍。所以,标量值小于 U+10000 的代码点被编码到单个代码单元中;UTF-32:UTF-32 中的代码单元由32 位组成;UTF-32 中使用的32 位代码单元足够大,每个代码点都可编码为单个代码单元;GB18030:GB18030 中的代码单元由8 位组成;在GB18030 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个或四个代码单元。 5,举例:“中国北京香蕉是个大笨蛋”这是我定义的aka字符集; 各字符对应代码点为: 北00000001 京00000010 香10000001 蕉10000010 是10000100 个10001000 大10010000 笨10100000 蛋11000000 中00000100 国00001000 下面是我定义的zixia 编码方案(8位),可以看到它的编码中表示了aka字符集的所有字符对应的代码单元; 北10000001 京10000010 香00000001 蕉00000010 是00000100 个00001000 大00010000 笨00100000 蛋01000000 中10000100 国10001000 所谓文本文件就是我们按一定编码方式将二进制数据表示为对应的文本如00000001000000100000010000001000000100000010000001000000这样的文件。我用一个支持zixia编码和aka字符集的记事本打开,它就按照编码方案显示为“香蕉是个大笨蛋” 如果我把这些字符按照GBK另存一个文件,那么则肯定不是这个,而是1100111111100011

日期格式大全

Java中日期格式转换 /** * 字符串转换为java.util.Date
* 支持格式为 yyyy.MM.dd G 'at' hh:mm:ss z 如 '2002-1-1 AD at 22:10:59 PSD'
* yy/MM/dd HH:mm:ss 如 '2002/1/1 17:55:00'
* yy/MM/dd HH:mm:ss pm 如 '2002/1/1 17:55:00 pm'
* yy-MM-dd HH:mm:ss 如 '2002-1-1 17:55:00'
* yy-MM-dd HH:mm:ss am 如 '2002-1-1 17:55:00 am'
* @param time String 字符串
* @return Date 日期
*/ public static Date stringToDate(String time){ SimpleDateFormat formatter; int tempPos=time.indexOf("AD") ; time=time.trim() ; formatter = new SimpleDateFormat ("yyyy.MM.dd G 'at' hh:mm:ss z"); if(tempPos>-1){ time=time.substring(0,tempPos)+ "公元"+time.substring(tempPos+"AD".length());//china formatter = new SimpleDateFormat ("yyyy.MM.dd G 'at' hh:mm:ss z"); } tempPos=time.indexOf("-"); if(tempPos>-1&&(time.indexOf(" ")<0)){ formatter = new SimpleDateFormat ("yyyyMMddHHmmssZ"); } else if((time.indexOf("/")>-1) &&(time.indexOf(" ")>-1)){ formatter = new SimpleDateFormat ("yyyy/MM/dd HH:mm:ss"); } else if((time.indexOf("-")>-1) &&(time.indexOf(" ")>-1)){ formatter = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss"); } else if((time.indexOf("/")>-1) &&(time.indexOf("am")>-1) ||(time.indexOf("pm")>-1)){ formatter = new SimpleDateFormat ("yyyy-MM-dd KK:mm:ss a"); } else if((time.indexOf("-")>-1) &&(time.indexOf("am")>-1) ||(time.indexOf("pm")>-1)){ formatter = new SimpleDateFormat ("yyyy-MM-dd KK:mm:ss a"); } ParsePosition pos = new ParsePosition(0); java.util.Date ctime = formatter.parse(time, pos); return ctime;

字符编码之间的相互转换 UTF8与GBK

字符编码之间的相互转换UTF8与GBK C++ UTF8编码转换CChineseCode 一预备知识 1,字符:字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。 2,字符集:字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集(iso8859-1,GB2312/GBK,unicode)。 3,代码点:字符集中的每个字符都被分配到一个“代码点”。每个代码点都有一个特定的唯一数值,称为标值。该标量值通常用十六进制表示。 4,代码单元:在每种编码形式中,代码点被映射到一个或多个代码单元。“代码单元”是各个编码方式中的单个单元。代码单元的大小等效于特定编码方式的位数:UTF-8 :UTF-8 中的代码单元由8 位组成;在UTF-8 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元;UTF-16 :UTF-16 中的代码单元由16 位组成;UTF-16 的代码单元大小是8 位代码单元的两倍。所以,标量值小于U+10000 的代码点被编码到单个代码单元中;UTF-32:UTF-32 中的代码单元由32 位组成;UTF-32 中使用的32 位代码单元足够大,每个代码点都可编码为单个代码单元;GB18030:GB18030 中的代码单元由8 位组成;在GB18030 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个或四个代码单元。 5,举例:“中国北京香蕉是个大笨蛋”这是我定义的aka字符集; 各字符对应代码点为: 北00000001 京00000010 香10000001 蕉10000010 是10000100 个10001000 大10010000 笨10100000 蛋11000000 中00000100 国00001000 下面是我定义的zixia 编码方案(8位),可以看到它的编码中表示了aka字符集的所有字符对应的代码单元; 北10000001 京10000010 香00000001 蕉00000010 是00000100 个00001000 大00010000 笨00100000 蛋01000000 中10000100 国10001000 所谓文本文件就是我们按一定编码方式将二进制数据表示为对应的文本如00000001000000100000010000001000000100000010000001000000这样的文件。我用一个支持zixia编码和aka字符集的记事本打开,它就按照编码方案显示为“香蕉是个大笨蛋” 如果我把这些字符按照GBK 另存一个文件,那么则肯定不是这个,而是1100111111100011 1011110110110110 1100101011000111 1011100011110110 1011010011110011 1011000110111111 1011010110110000 110100001010 二,字符集

java把当前时间转换成一个无符号的字符串

用java实现把当前时间转换成无符号的字符串 import java.util.Date; import java.text.SimpleDateFormat; public class CurrentTime { public String getCurrentTime()//获得当前时间 { Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); String time= dateFormat.format( now ); return time; } public String splitString(String str,String n)//字符拆分方法 { String st[]=str.split(n); str=""; for(int i=0;i

字符编码之间的相互转换

字符编码之间的相互转换 UTF8与GBK C++ UTF8编码转换 CChineseCode 一预备知识 1,字符:字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。 2,字符集:字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集(iso8859-1,GB2312/GBK,unicode)。 3,代码点:字符集中的每个字符都被分配到一个“代码点”。每个代码点都有一个特定的唯一数值,称为标值。该标量值通常用十六进制表示。 4,代码单元:在每种编码形式中,代码点被映射到一个或多个代码单元。“代码单元”是各个编码方式中的单个单元。代码单元的大小等效于特定编码方式的位数: UTF-8 :UTF-8 中的代码单元由 8 位组成;在 UTF-8 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元; UTF-16 :UTF-16 中的代码单元由 16 位组成;UTF-16 的代码单元大小是 8 位代码单元的两倍。所以,标量值小于 U+10000 的代码点被编码到单个代码单元中; UTF-32:UTF-32 中的代码单元由 32 位组成; UTF-32 中使用的 32 位代码单元足够大,每个代码点都可编码为单个代码单元; GB18030:GB18030 中的代码单元由 8 位组成;在 GB18030 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个或四个代码单元。 5,举例:“中国北京香蕉是个大笨蛋”这是我定义的aka字符集;各字符对应代码点为:北 00000001 京 00000010 香 10000001 蕉 10000010 是 10000100 个 10001000 大 10 010000 笨 10100000 蛋 11000000 中 00000100 国 00001000 下面是我定义的 zixia 编码方案(8位),可以看到它的编码中表示了aka字符集的所有字符对应的代码单元; 北 10000001 京 10000010 香 00000001 蕉 00000010 是 00000100 个 00001000 大 00010000 笨 00100000 蛋 01000000 中 10000100 国 10001000 所谓文本文件就是我们按一定编码方式将二进制数据表示为对应的文本如 00000001000000100000010000001000000100000010000001000000这样的文件。我用一个支持 zixia编码和aka字符集的记事本打开,它就按照编码方案显示为“香蕉是个大笨蛋”如果我把这些字符按照GBK另存一个文件,那么则肯定不是这个,而是 1100111111100011 1011110110110110 1100101011000111 1011100011110110 101101001 1110011 1011000110111111 1011010110110000 110100001010 二,字符集 1,常用字符集分类 ASCII及其扩展字符集作用:表语英语及西欧语言。位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。范围:ASCII从00到7F,扩展从00到FF。 ISO-8859-1字符集作用:扩展ASCII,表示西欧、希腊语等。位数: 8位,范围:从00到FF,兼容ASCII字符集。 GB2312字符集作用:国家简体中文字符集,兼容ASCII。位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。范围:高字节从A1到F7, 低字节从A1到FE。将高字节和低字节分别加上0XA0即可得到编码。 BIG5字符集作用:统一繁体字编码。位数:使用2个字节表示,表示13053个汉字。范围:高字节从A1到F9,低字节从40到7E,A1到FE。 GBK字符集作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312。位数:使用2个字节表示,

Java字符串转换为日期和时间比较大小

转]Java字符串转换为日期和时间比较大小 [ 2009-07-10 09:51:51 | 作者: hansong | 来自: 原创] 字体大小: 大| 中| 小方法一: DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); String dateBegin=fmt.format(carrierCommand.getDateBegin()); String dateEnd=fmt.format(carrierCommand.getDateEnd()); //如果获得的日期格式不是'2008-05-22',就必须要格式化一下日期 String dateBegin = request.getParameter("dateBegin"); String dateEnd = request.getParameter("dateEnd"); if(java.sql.Date.valueOf(dateBegin).after(java.sql.Date.valueOf(dateEnd))){ //起始日期大于结束日期 errors.rejectValue("dateEnd", null, "起始日期必须小于结束日期!"); } StringBuffer timeBegin = new StringBuffer(); StringBuffer timeEnd = new StringBuffer(); timeBegin.append(request.getParameter("timeBegin")); timeEnd.append(request.getParameter("timeEnd")); timeBegin.append(":00"); timeEnd.append(":00"); if(java.sql.Date.valueOf(dateBegin).equals(java.sql.Date.valueOf(dateEnd))) { //起始日期等于结束日期 if(java.sql.Time.valueOf(timeBegin.toString()).equals(java.sql.Time.valueOf (timeEnd.toString())))//时间相同 { errors.rejectValue("timeEnd", null, "起始与结束日期相同,起始时间必须小于结束时间!"); } if(java.sql.Time.valueOf(timeBegin.toString()).after(java.sql.Time.valueOf (timeEnd.toString())))//时间相同 { errors.rejectValue("timeEnd", null, "起始与结束日期相同,起始时间必须小于结束时间!"); } } 方法二: import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; /** * * @author hp */ public class test {

字符编码转换

Gbk码位图 各种编码之间转换的基本原理:以unicode码值为中间载体,被转换的字符先根据其原来的编码规则,解码出对应的unicode值,然后,根据unicode值在转换成目标编码。由此,就需要不同编码码值和unicode的对应关系,目前gbk和unicode之间的对应关系由查表得到,gb18030和unicode的对应关系一部分查表,一部分通过计算可得。 1.gbk to utf8

gbk两个字节表示一个字符,根据gbk与unicode对应关系,得到该字符的unicode值,得到unicode值之后,根据utf8的编码规则,判断unicode值范围,确定用来编码的字节数,确定字节数后,由utf8的编码规则分别填充每个字节; 例子: ‘破’的gbk编码为0xc6c6,两个字节分别为0xc6和0xc6,根据gbk与unicode对应关系查表得到‘破’的unicode值为0x7834;根据utf8编码规则,0x7834位于 U+0800 – U+FFFF区间,所以需要三个字节,且编码后形式为1110xxxx 10xxxxxx 10xxxxxx,0x7834对应的二进制位01111000 0011 0100,将此二进制从左到右填充x,就得到后‘破’的utf8编码11100111 10100000 10110100,也就是0xE7 0xA0 0xB4三个字节。 2.utf8 to gbk utf8变长字节编码,根据utf8的编码规则,根据收到的第一个字节大小判断构成该字符的字节数num,分别判断从当前字节起的num个字节是否符合utf8编码规则,不符合做出错处理;符合utf8的规则后,开始解码为unicode值,解码的操作就按照编码返回来,得到unicode码值后,查表就可以得到对应的gbk编码字节。 例子: ‘破’的utf8编码值为0xE7 0xA0 0xB4三个字节,对应的二进制为11100111 10100000 10110100,按照utf8的编码规则,着色部分组合到一起为对应的unicode值,于是得到unicode值0111100000110100,0x7834,查表得到0x7834对应的gbk码值0xc6c6,这样转换后的gbk编码就是0xc6,0xc6两个字节。 3.gb18030 to utf8 gb18030变长编码,1、2、4个字节;对收到的gb18030编码数据先根据第一个字节确定几个字节构成的字符,如果<0x7f,则为一个字节;否则为2或4个字节,接下来判断第二个字节的范围,若第二个字节在40 7E或者80 FE之间,则为二个字节;否则为四个字节。确定字节后,开始寻找对应的unicode值,18030与gbk不同的是,不同字节数确定unicode的方法不同,2字节的与gbk一样(个别不一致),4字节的一部分需要查表(0x81308130~0x8439FE39),4字节的其余可根据公式算出(0x90308130~0xE339FE39)。假设某字符的gb18030编码为四个字节0x91 0x31 0x84 0x36,根据范围,此四个字节需要通过公式计算,计算公式为(0x91-0x90)*12600+(0x31-0x30)*1260 +(0x84-0x81)*10+(0x36-0x30)= 0x3648,即unicode值。得到unicode值后,按照utf8编码可得到对应的utf8字节。 4.utf8 to gb18030 utf8转换unicode值在2里面以介绍,得到unicode之后,判断unicode值落在的区间,如果unicode值在0x0000-0xFFFF之间,则通过查表可得到对应的gb18030码值;若大于0xFFFF,则u = unicode-0x10000,根据以下公式得到对应的gb18030码值。 U=Unicode编码-0x10000 m1=U/12600 n1=U%12600 m2=n1/1260 n2=n1%1260 m3=n2/10 n3=n2%10 第一字节b1=m1+0x90,第二字节b2=m2+0x30,第三字节b3=m3+0x81 第四字节b4=n3+0x30

相关主题
文本预览
相关文档 最新文档