字符是否是占16位的?

先把包含编码“u82f9u679c”的文件保存为这个名字:pingguo_UTF16.txt

如果你说的“字符”就是指 Ja 中的 char,那好,那它就是 16 位,2 字节。

utf16编码转换器 utf-16编码转换中文utf16编码转换器 utf-16编码转换中文


utf16编码转换器 utf-16编码转换中文


utf16编码转换器 utf-16编码转换中文


用PHP的iconv扩展转换

如果你说的“字符”是指我们用眼睛看到的那些“抽象的字符”,那么,谈论它占几个字节是没有意义的。具体地讲,脱离具体的编码谈某个字符占几个字节是没有意义的。

就好比有一个抽象的整数“42”,你说它占几个字节?这得具体看你是用 byte,short,int,还是 long 来存它。

字符是同样的道理,如果你想谈“占几个字节”,就要先把编码说清楚。同一个字符在不同的编码下可能占不同的字节。

就以你举的“字”字为例,“字”在 GBK 编码下占 2 字节,在 UTF-16 编码下也占 2 字节,在 UTF-8 编码下占 3 字节,在 UTF-32 编码下占 4 字节。不同的字符在同一个编码下也可能占不同的字节。

“字”在 UTF-8 编码下占3字节,而“A”在 UTF-8 编码下占 1 字节。(因为 UTF-8 是变长编码),而 Ja 中的 char 本质上是 UTF-16 编码。而 UTF-16 实际上也是一个变长编码(2 字节或 4字节)。

如果一个抽象的字符在 UTF-16 编码下占 4 字节,显然它是不能放到 char 中的。换言之, char 中只能放 UTF-16 编码下只占 2 字节的那些字符。而 getBytes 实际是做编码转换,你应该显式传入一个参数来指定编码,否则它会使用缺省编码来转换。

你说“ new String("字").getBytes().length 返回的是3 ”,这说明缺省编码是 UTF-8.

否则,会使用所在作系统环境下的缺省编码。

通常,Windows 系统下是 GBK,Linux 和 Mac 是 UTF-8.

由于受启动参数及所在作系统环境的影响,不带参数的 getBytes 方法通常是不建议使用的,是显式地指定参数以此获得稳定的预期行为。

怎样将其他格式编码的文本文档批量转换成Unicode的格式?

你好,用Replace

Pioneer批量转换编码。

不确定你需要转换成utf8格式还是utf16。以utf8为例:

设你的文件是ansi(gbk),用Replace

Pioneer批量转换为UTF8的方法如下:

步:选文件

1.打开Tools->Batch

2.点击Pick

Files,用鼠标对需要处理的多个文件进行多选。如果你需要的文件类型选不了,把文件类型改选成All

files$intGB = hexdec(bin2hex($strCurr)) - 0x8080;

.

第二步:变换$intCodeU = ord($strBuf{0}) + 256 ord($strBuf{1});编码

1.点击Change

Encode按钮

2.点击input

encoding,设置成CN->gbk

3.点击output

encoding,设置成utf-8

4.点击start,完成

filename,把它从${FILENAME}改成新的规则,比如${FILENAME}.new,还要注意备份,以防作失误。

如果你要的utf-8文件带BOM标识,需要选utf-8-BOM而不是utf-8

php对gb编码动态转utf-8编码的几种方法评测

字转换:wctomb、mbtowc,wc 指 Wide charactor,mb 指 Multi-byte。

在《IP地址-地理位置转换的测评》一文中提到用ip2addr函数直接读取IP数据库文件是效率的,相比用MySQL数据库存储IP数据,用SQL查询是效率的。但是IP数据库文件QQWry.dat是GB2312编码的。现在我需要UTF-8编码的地理位置结果。如果用MySQL方法,可以在数据存入数据库时就转换为UTF-8编码,一劳永逸。但是QQWry.dat文件又无法修改,只能把ip2addr函数的输出结果再进行动态转换。

动态转换GB-UTF-8编码至少有四种方法:

用PHP的mb_string扩展转换

用对换表转换,对换表存储在MySQL数据库中

用对换表转换,对换表存储在文本文件中

前两种方法要作了相应设置(编译安装了相应扩展)才能使用。我的虚拟主机没有这两个扩展,只好考虑后两种方法。前两个方法本文也不进行测评。

测评程序如下(func_ip.php参见《IP地址-地理位置转换的测评》一文):

?php

require_once ("func_ip.php");

$str = "";

if ($c

0x80) {

$str .= $c;

} elseif ($c

0x800) {

$str .= chr(0xC0 | $c

$str .= chr(0x80 | $c

} elseif ($c

0x10000) {

$str .= chr(0xE0 | $c

12);

$str .= chr(0x80 | $c

60x3F);

$str .= chr(0x80 | $c

} elseif ($c

0x200000) {

$str .= chr(0xF0 | $c

18);

$str .= chr(0x80 | $c

12

$str .= chr(0x80 | $c

60x3F);

$str .= chr(0x80 | $c

}return $str;

}function GB2UTF8_SQL($strGB) {

if (!trim($strGB)) return $strGB;

$strRet = "";

$intLen = strlen($strGB);

if (ord($strGB{$i})

127) {

$strCurr = substr($strGB, $i, 2);

$strSql = "SELECT code_unicode FROM nnstats_gb_unicode

WHERE code_gb = ".$intGB." LIMIT 1"

;$resResult = mysql_query($strSql);

if ($arrCode = mysql_fetch_array($resResult)) $strRet .= u2utf8($arrCode["code_unicode"]);

else $strRet .= "??";

$i++;

} else {

$strRet .= $strGB{$i};

}}

}function GB2UTF8_FILE($strGB) {

if (!trim($strGB)) return $strGB;

$arrLines = file("gb_unicode.txt");

foreach ($arrLines as $strLine) {

$arrCodeTable[hexdec(substr($strLine, 0, 6))] = hexdec(substr($strLine, 7, 6));

}$strRet = "";

$intLen = strlen($strGB);

if (ord($strGB{$i})

127) {

$strCurr = substr($strGB, $i, 2);

if ($arrCodeTable[$intGB]) $strRet .= u2utf8($arrCodeTable[$intGB]);

else $strRet .= "??";

$i++;

} else {

$strRet .= $strGB{$i};

}}

}function EncodeIp($strDotquadIp) {

$arrIpSep = explode('.', $strDotquadIp);

if (count($arrIpSep) != 4) return 0;

$intIp = 0;

return $int6);Ip;

//return sprintf('%02x%02x%02x%02x', $arrIpSep[0], $arrIpSep[1], $arrIpSep[2], $arrIpSep[3]);

}function GetMicroTime() {

list($msec, $sec) = explode(" ", microtime());

return ((double)$msec + (double)$sec);

}for ($i = 0; $i

100; $i++) { // 随机产生100个ip地址

$strIp = mt_rand(0, 255).".".mt_rand(0, 255).".".mt_rand(0, 255).".".mt_rand(0, 255);

$arrAddr[$i] = ip2addr(EncodeIp($strIp));

}$resConn = mysql_connect("localhost", "netnest", "netnest");

mysql_select_db("test");

// 测评MySQL查询的编码转换

$dblTimeStart = GetMicroTime();

100; $i++) {

$strUTF8Region = GB2UTF8_SQL($arrAddr[$i]["region"]);

$strUTF8Address = GB2UTF8_SQL($arrAddr[$i]["address"]);

}$dblTimeDuration = GetMicroTime() - $dblTimeStart;

// 测评结束并输出结果

echo $dblTimeDuration; echo " ";

// 测评文本文件查询的编码转换

$dblTimeStart = GetMicroTime();

100; $i++) {

$strUTF8Region = GB2UTF8_FILE($arrAddr[$i]["region"]);

$strUTF8Address = GB2UTF8_FILE($arrAddr[$i]["address"]);

}$dblTimeDuration = GetMicroTime() - $dblTimeStart;

// 测评结束并输出结果

echo $dblTimeDuration; echo " ";

?测评两次结果(到3位小数,单位是秒):

MySQL查询转换:0.112

文本查询转换:10.590

MySQL查询转换:0.099

文本查询转换:10.623

可见这次是MySQL方法于文件查询法。但是现在还不急于使用MySQL方法,因为文本文件方法之所以如此耗时,主要因为它每次转换都要把整个gb_unicode.txt读入内存,而gb_unicode.txt又是文本文件,格式如下:

0x2121 0x3000 # IDEOGRAPHIC SPACE

0x2122 0x3001 # IDEOGRAPHIC COMMA

0x2123 0x3002 # IDEOGRAPHIC FULL STOP

0x2124 0x30FB # KATAKANA MIDDLE DOT

0x2125 0x02C9 # MODIFIER LETTER MACRON (Mandarin Chinese first tone)

0x552A 0x6458 # CJK

0x552B 0x658B # CJK

0x552D 0x7A84 # CJK

0x777B 0x9F37 # CJK

0x777C 0x9F3D # CJK

0x777D 0x9F3E # CJK

0x777E 0x9F44 # CJK

文本文件效率较低,于是考虑把文本文件转换为二进制文件,然后用折半法查找这个文件,而不需要把整个文件读入内存。文件格式为:文件头2字节,存储记录数;接着一条接一条记录存入文件,每条记录4字节,前2字节对应GB代码,后2字节对应Unicode代码。转换程序如下:

?php

$arrLines = file("gb_unicode.txt");

foreach ($arrLines as $strLine) {

$arrCodeTable[hexdec(substr($strLine, 0, 6))] = hexdec(substr($strLine, 7, 6));

}ksort($arrCodeTable);

$intCount = count($arrCodeTable);

$strCount = chr($intCount % 256) . chr(floor($intCount / 256));

$fileGBU = fopen("gbu.dat", "wb");

fwrite($fileGBU, $strCount);

foreach ($arrCodeTable as $k = $v) {

$strData = chr($k % 256) . chr(floor($k / 256)) . chr($v % 256) . chr(floor($v / 256));

fwrite($fileGBU, $strData);

?执行程序后就获得了二进制的GB-Unicode对照表gbu.dat,并且数据记录按GB代码排了序,便于折半法查找。使用gbu.dat进行转码的函数如下:

function GB2UTF8_FILE1($strGB) {

if (!trim($strGB)) return $strGB;

$fileGBU = fopen("gbu.dat", "rb");

$strBuf = fread($fileGBU, 2);

$intCount = ord($strBuf{0}) + 256 ord($strBuf{1});

$strRet = "";

$intLen = strlen($strGB);

if (ord($strGB{$i})

127) {

$strCurr = substr($strGB, $i, 2);

$intStart = 1;

$intEnd = $intCount;

while ($intStart

$intEnd - 1) { // 折半法查找

$intMid = floor(($intStart + $intEnd) / 2);

$intOffset = 2 + 4 ($intMid - 1);

fseek($fileGBU, $intOffset);

$strBuf = fread($fileGBU, 2);

$intCode = ord($strBuf{0}) + 256 ord($strBuf{1});

if ($intGB == $intCode) {

$intStart = $intMid;

break;

}if ($intGB

$intCode) $intStart = $intMid;

else $intEnd = $intMid;

}$intOffset = 2 + 4 ($intStart - 1);

fseek($fileGBU, $intOffset);

$strBuf = fread($fileGBU, 2);

$intCode = ord($strBuf{0}) + 256 ord($strBuf{1});

if ($intGB == $intCode) {

$strBuf = fread($fileGBU, 2);

$strRet .= u2utf8($intCodeU);

} else {

$strRet .= "??";

}$i++;

} else {

$strRet .= $strGB{$i};

}}

}把其加到原来的测评程序,对三种方法同时测评2次得到数据(到3位小数,单位:秒):

MySQL方法:0.125

文本文件方法:10.873

二进制文件折半法:0.106

MySQL方法:0.102

文本文件方法:10.677

二进制文件折半法:0.092

可见二进制文件折半法还比MySQL法略有优势。但是上述测评都是对短的地理位置进行转码,如果对较长的文本转码又如何呢?我找来5个Blog的RSS 2.0文件,都是GB2312编码。测评三种方法对5个文件编码耗费的时间,2次测量数据如下(到3位小数,单位:秒):

MySQL方法:7.206

文本文件方法:0.772

二进制文件折半法:5.022

MySQL方法:7.440

文本文件方法:0.766

二进制文件折半法:5.055

可见对长的文本是用文本文件的方法,因为转码对照表读入内存后,转码就可以很高效了。既然如此,我们还可以尝试改进一下,把文本文件方法改为:转码对照表从二进制文件gbu.dat读入内存,而不是文本文件。测评数据如下(精度和单位同上):

从文本文件读入对照表:0.766

从二进制文件读入对照表:0.831

从文本文件读入对照表:0.774

从二进制文件读入对照表:0.833

表明这次改进失败了,从文本文件读入转码对照表更高效。

总结:用PHP对GB编码到UTF-8编码的动态转换,如果每次转换的文本很小,适宜用二进制文件结合折半法转换;如果每次转换的文本较大,适宜用文本文件存储转码对照表,并在转换前一次性把对照表读入内存。

C语言控制台程序,中文输出变成乱码,怎么解决

output

这里涉及到一个字符在源代码(文本)中,编译好的二进制文件中,以及控制台输出编码形式的区别.

foreach ($arrIpSep as $k = $v) $intIp += (int)$v pow(256, 3 - $k);

首先,要明确一点:C(语言/程序)并不理解ANSI,UTF-8以及任何其他编码.它只知道处理你给它的字符的二进制表示.

在简体中文Windows下,默认的文本保存编码是ANSI(即GBK);Linux下根据系统locale设定,一般应该是(zh_CN.UTF-8).(以下基于简体中文Windows)

1)对于源文件中保存的"中文"这个字符串,VS2008看到的就是"0xd6d0"和"0xcec4"的形式(默认ANSI编码得到).但编译器才不管是不是GBK神,它就管那串数字.

区别,MinGW看到的是"0xe4b8ad"和"0xe69687"(gcc默认UTF-8).注意,用MinGW编译的源文件中有中文宽字符必须保存为UTF-8编码.

2)然后,在二进制文件中的存储形式,对传统的字符串(char str[] = "中文";),编译器什么都不做,直接把那串数字(如"0xd6d0","0xcec4")搬过去塞进二进制文件.

但对于宽字符串(wchar_t wstr[] = L"中文";),编译器会将其做转换,转换成Unicode编码格式(在Windows是UTF-16,而Linux下是UTF-32).如"中文"的16位Unicode是"0x4e2d"和"0x6587",然后把这串转换后的数字("0x4e2d","0x6587")塞进二进制文件中.(这里VS和MinGW做的没有区别)

这里有点需要注意,编译器必须知道你的源文件保存的编码!如VS默认是ANSI编码,如果你用UTF-8保存.c源文件去用VS打开看一定是乱码.同理如果你用mingw编译ANSI编码保存的源文件,也会出错!(但可以修改编译选项解决,见文章末尾) 在本文这里这个原因其实很好理解,因为编译器需要知道,如果它要将一个保存在文件中的字符转成宽字符时,是从什么编码转到Unicode.(可见上述VS是GBK->Unicode,而MinGW是UTF-8->Unicode)

请问如何用C语言实现汉字和Unicode编码的转换 求程序

}

字符串转换:wcsto、towcs,wcs 和 的 s 指 string。

这 4 个函数是 C 标准函数库函数中的。如果只是在 Windows 平台下编程,可直接调用 Windows API 函数 WideCharToMultiByte 和 MultiByteToWideChar 实现。但是如果调用标准库函数的话,在 Linux 下也是有效的。调用标准库函数,首先必须包含 locale.h 并调用 setlocale(LC_ALL, "") 后才能正确转换。Windows 下的 Multi-byte 是 ANSI 编码的,Wide charactor 是 Unicode (UTF-16) 编码,而 Linux 下的 Multi-byte 是 UTF-8 编码的,Wide charactor 是 Unicode (UTF-32) 编码。

#include

#include

#include

int main(void)

{char str[12];

wchar_t wstr[] = { 0x52B3, 0x788C, 0 };

setlocale(LC_ALL, "");

wcsto(str, wstr, sizeof(str)/sizeof(char));

printf("%s", str);

returnreturn $strRet; 0;

怎么把十六进制的数字转换为字符串

Runner菜单

编程——字符串——数值/字符串转换——十六进制数字字符串至数值转换

不知道你要什么语言的,这是C#,十六进制转中文

///

/// 从16进制转换成汉字

///

///

///

编码,如"utf-8","gb2312"

///

public static string UnHex(string hex, string charset)

{if (hex == null)

throw new ArgumentNullException("hex");

hex = hex.Replace(",", "");

hex = hex.Replace(function u2utf8($c) {"n", "");

hex = hex.Replace("", "");

hex = hex.Replace(" ", "");

if (hex.Length % 2 != 0)

{hex += "20";//空格

}// 需要将 hex 转换成 byte 数组。

byte[] bytes = new byte[hex.Length / 2];

for (int i = 0; i < bytes.Length; i++)

{try

{// 每两个字符是一个 byte。

bytes[i] = byte.Parse(hex.Substring(i 2, 2),

}catch

{// Rrow an exception with custom message.

throw new ArgumentException("hex is not a valid hex number!", "hex");

}}

System.Text.Encoding chs = System.Text.Encoding.GetEncoding(charset);

return chs.GetString(bytes);

怎么用VC实现ANSI编码的文本文件转换成UTF8编码 C语言

0x552C 0x5B85 # CJK

你要先阅读一下宽字符和UTF-8的编码方式,a nsi的编码要转换成宽字符再按utf-8编码(关键的前三个比特位)

for ($i = 0; $i

我们已经不用VC6了,那是上个实际的产品。目前的编译器全部是UTF16

怎么修改windows 7 文件的默认编码方式

你把文字copy一下$intLen; $i++) {,粘贴到文本txt,之后保存,保存的时候下面就有编码呀,你改一下就好了

用note注:如果你想把输出保存到新文件里,可以在点击Start之前修改setpad打开,另存为,最下的“编码”选为UTF-8即可

编码解码工具 之 Base16编码/解码

}fclose($fileGBU);

Base16编码使用16个ASCII可打印字符(数字0-9和字母A-F)对任意字节数据进行编码。Base16先获取输入字符串每个字节的二进制值(不足8比特在高位补0),然后将其串联进来,再按照4比特一组进行切分,将每组二进制数分别转换成十进制,在下述表格中找到System.Globalization.NumberStyles.HexNumber);对应的编码串接起来就是Base16编码。

shell哪个命令可以将uicode编码转换成中文?

for ($i = 0; $i

使用iconv命令即可,大多数Linux发布版都自带:

然后执行下面命令:

iconv -f UTF16 -t UTF8 pingguo_UTF16.txt > pingguo_UTF8.txt

iconv -f UTF16 -t GB18030 pingguo_UTF16.txt > pingguo0x3F);_GB18030.txt

用文本编辑器打开查看这两个(pingguo_UTF8.txt / pingguo_GB18030.txt)新文件即可。