utf16编码转换器 utf-16编码转换中文
字符是否是占16位的?
先把包含编码“u82f9u679c”的文件保存为这个名字:pingguo_UTF16.txt如果你说的“字符”就是指 Ja 中的 char,那好,那它就是 16 位,2 字节。
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)新文件即可。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。