求助:如何把int类型的内码转换为eslint 指定文件编码汉字

博客访问: 169688
博文数量: 121
博客积分: 1144
博客等级: 少尉
技术积分: 931
注册时间:
原文地址: 作者:
一、利用iconv函数族进行编码转换
在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。
iconv函数族的头文件是iconv.h,使用前需包含之。
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: 用C语言实现的转换示例程序
/* f.c : 代码转换示例C程序 */
#define OUTLEN 255
char *in_utf8 = "姝e?ㄥ??瑁?";
char *in_gb2312 = "正在安装";
char out[OUTLEN];
//unicode码转为gb2312码
rc = u2g(in_utf8,strlen(in_utf,out,OUTLEN);
printf("unicode-->gb2312 out=%sn",out);
//gb2312码转为unicode码
rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
printf("gb2312-->unicode out=%sn",out);
//代码转换:从一种编码转为另一种编码
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
char **pin = &
char **pout = &
cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
//UNICODE码转为GB2312码
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
//GB2312码转为UNICODE码
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
例子2: 用C++语言实现的转换示例程序
/* f.cpp : 代码转换示例C++程序 */
#define OUTLEN 255
// 代码转换操作类
class CodeConverter {
CodeConverter(const char *from_charset,const char *to_charset) {
cd = iconv_open(to_charset,from_charset);
~CodeConverter() {
iconv_close(cd);
// 转换输出
int convert(char *inbuf,int inlen,char *outbuf,int outlen) {
char **pin = &
char **pout = &
memset(outbuf,0,outlen);
return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen);
int main(int argc, char **argv)
char *in_utf8 = "姝e?ㄥ??瑁?";
char *in_gb2312 = "正在安装";
char out[OUTLEN];
// utf-8-->gb2312
CodeConverter cc = CodeConverter("utf-8","gb2312";
cc.convert(in_utf8,strlen(in_utf,out,OUTLEN);
cout <gb2312 in=" << in_utf8 << ",out=" << out <<
// gb2312-->utf-8
CodeConverter cc2 = CodeConverter("gb2312","utf-8";
cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN);
cout <utf-8 in=" << in_gb2312 << ",out=" << out <<
二、利用iconv命令进行编码转换
在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。
iconv命令用于转换指定文件的编码,默认输出到标准输出设备,亦可指定输出文件。
用法: iconv [选项...] [文件...]
有如下选项可用:
输入/输出格式规范:
-f, --from-code=名称 原始文本编码
-t, --to-code=名称 输出编码
-l, --list 列举所有已知的字符集
输出控制:
-c 从输出中忽略无效的字符
-o, --output=FILE 输出文件
-s, --silent 关闭警告
--verbose 打印进度信息
-?, --help 给出该系统求助列表
--usage 给出简要的用法信息
-V, --version 打印程序版本号
iconv -f utf-8 -t gb2312 aaa.txt >bbb.txt
这个命令读取aaa.txt文件,从utf-8编码转换为gb2312编码,其输出定向到bbb.txt文件。
小结: LINUX为我们提供了强大的编码转换工具,给我们带来了方便。
glibc带了一套转码函数iconv,使用方便,可识别的码很多,如果程序需要涉及到编码之间的转换,可考虑用它。
iconv命令的用法。
$ iconv --list # 显示可识别的编码名称
$ iconv -f GB2312 -t UTF-8 a.html > b.html # 转换GB2312编码的文件a.html为UTF-8编码,存入b.html
$ iconv -f GB2312 -t BIG5 a.html > b.html # 转换GB2312编码的文件a.html为BIG5编码,存入b.html
iconv编程涉及到以下glibc库的调用:
iconv_t iconv_open(const char *tocode, const char *fromcode);
int iconv_close(iconv_t cd);
size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);
在使用iconv转码的时候,首先用iconv_open获取转码句柄,然后调用iconv转码,转完了后调用iconv_close关闭句柄。
iconv函数中:
参数cd是用iconv_open调用返回的转码句柄;
参数inbuf指向需要转码的缓冲区;
参数inbytesleft是inbuf所保存的需要转码的字节数;
参数outbuf存放转码结果;
参数outbytesleft存放outbuf空间的大小。
如果调用成功,iconv返回转换的字节数(不可逆转调用的字节数,可逆转调用的字节数不包括在内)。否则返回-1,并设置相应的errno。
iconv逐步扫描inbuf,每转换一个字符,就增加inbuf,减少inbytesleft,并将结果存入outbuf,结果字节数存入 outbytesleft。遇到下列情况将停止扫描并返回:
1. 多字节序列无效,这时候errno为EILSEQ,*inbuf指向第一个无效的字符;
2. 有字节留在inbuf尚未转换,errno为EINVAL;
3. outbuf空间不够,errno为E2BIG;
4. 正常转换完备。
对于iconv函数,还有两种调用情况:
1. inbuf或者*inbuf为NULL,outbuf和*outbuf不为NULL,iconv会设置转换状态为初始状态,并保存转换序列到*outbuf。如果outbuf空间不足,errno会设置为E2BIG,返回(size_t)(-1);
2. inbuf或者*inbuf为NULL,outbuf或者*outbuf也为NULL,iconv设置转换状态为初始状态。
iconv命令的使用固然方便,可是如果转换过程中如果遇到问题则会停止转换,有时候我们希望跳过不能转换的字节序列继续转换。以下的一段程序能实现这种功能。
* siconv.cpp - A simple way to demostrate the usage of iconv calling
* Report bugs to
* July 15th, 2006
#ifdef DEBUG
#define TRACE(fmt, args...) fprintf(stderr, "%s:%s:%d:"fmt, \
__FILE__, __FUNCTION__, __LINE__, ##args)
#define TRACE(fmt, args...)
#define CONVBUF_SIZE 32767
void print_err(const char *fmt, ...)
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
int print_out(const char* buf, size_t num)
if (num != fwrite(buf, 1, num, stdout)) {
& &return -1;
void print_usage() {
print_err("Usage: siconv -f encoding -t encoding [-c] "
& &"input-file\n";
int iconv_string(const char *from, const char *to,
& &&&const char *src, size_t len,
& &&&::std::string& result,
& &&&int c = 0, size_t buf_size = 512)
char *pinbuf = const_cast(src);
size_t inbytesleft =
char *poutbuf = NULL;
size_t outbytesleft = buf_
char *dst = NULL;
size_t retbytes = 0;
int done = 0;
int errno_save = 0;
if ((iconv_t)-1 == (cd = iconv_open(to, from))) {
& &return -1;
dst = new char[buf_size];
while(inbytesleft > 0 && !done) {
& &poutbuf =
& &outbytesleft = buf_
& &TRACE("TARGET - in:%p pin:%p left:%d\n", src, pinbuf, inbytesleft);
& &retbytes = iconv(cd, &pinbuf, &inbytesleft, &poutbuf, &outbytesleft);
& &errno_save =
& &if (dst != poutbuf) {// we have something to write
& & TRACE("OK - in:%p pin:%p left:%d done:%d buf:%d\n",
& &&&src, pinbuf, inbytesleft, pinbuf-src, poutbuf-dst);
& & result.append(dst, poutbuf-dst);
& &if (retbytes != (size_t)-1) {
& & poutbuf =
& & outbytesleft = buf_
& & (void)iconv(cd, NULL, NULL, &poutbuf, &outbytesleft);
& & if (dst != poutbuf) {// we have something to write
& && &TRACE("OK - in:%p pin:%p left:%d done:%d buf:%d\n",
& && &src, pinbuf, inbytesleft, pinbuf-src, poutbuf-dst);
& &&&result.append(dst, poutbuf-dst);
& & errno_save = 0;
& &TRACE("FAIL - in:%p pin:%p left:%d done:%d buf:%d\n",
& & src, pinbuf, inbytesleft, pinbuf-src, poutbuf-dst);
& &switch(errno_save) {
& &case E2BIG:
& & TRACE("E E2BIG\n";
& &case EILSEQ:
& & TRACE("E EILSEQ\n";
& & if (c) {
& &&&errno_save = 0;
& &&&inbytesleft = len-(pinbuf-src); // forward one illegal byte
& &&&inbytesleft--;
& &&&pinbuf++;
& & done = 1;
& &case EINVAL:
& & TRACE("E EINVAL\n";
& & done = 1;
& &default:
& & TRACE("E Unknown:[%d]%s\n", errno, strerror(errno));
& & done = 1;
iconv_close(cd);
errno = errno_
return (errno_save) ? -1 : 0;
int conv_file_fd(const char* from, const char *to, int fd,
& &&&::std::string& result, int c)
if (0 != fstat(fd, &st)) {
& &return -1;
start = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (MAP_FAILED == start) {
& &return -1;
if (iconv_string(from, to, (char*)start,
& &st.st_size, result, c, CONVBUF_SIZE) < 0) {
& &int errno_save =
& &munmap(start, st.st_size);
& &TRACE("\n";
& &errno = errno_
& &return -1;
munmap(start, st.st_size);
int conv_file(const char* from, const char* to,
& &&&const char* filename, int c)
if (NULL == (fp=fopen(filename, "rb")) {
& &print_err("open file %s:[%d]%s\n", filename,
& & errno, strerror(errno));
& &return -1;
if (conv_file_fd(from, to, fileno(fp), result, c) < 0) {
& &print_err("conv file fd:[%d]%s\n", errno, strerror(errno));
& &fclose(fp);
& &return -1;
print_out(result.data(), result.size());
fclose(fp);
int main(int argc, char *argv[])
#ifdef TESTCASE
::std::string strA = "欢迎(welcome ^_^)来到(to)首都北京。";
::std::string strB = "大喊一声:We are chinese
我们都是中国人。";
::std::string strC = strA.substr(0, 20) + strB.substr(0, 41);
if (iconv_string("GBK", "UTF-8", strC.data(), strC.size(), result,
& &TRACE("ERROR [%d]%s\n", errno, strerror(errno));
TRACE("CONVERSION RESULT:";
result.append("\n";
print_out(result.data(), result.size());
::std::string from,
::std::string input_
int c = 0;
while (-1 != (c = getopt(argc, argv, "f:t:c")))
& &switch(c) {
& &case 'f':
& & from =
& &case 't':
& &case 'c':
& & c = 1;
& &default:
& & return -1;
if (from.empty() || to.empty() || optind != (argc-1))
& &print_usage();
& &return -1;
input_file = argv[optind++];
return conv_file(from.c_str(), to.c_str(),
& &input_file.c_str(), c);
可以用内存映像文件解决文件太大内存缓冲不够的情况。相对于iconv命令,加-c选项,以忽略转换过程中可能引发的问题。
$ g++ -o siconv siconv.cpp
如果在命令行加了-DDEBUG选项,会编译进调试语句,如果加了-DTESTCASE选项,则仅会编译对iconv_string函数测试的情况。
阅读(369) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。求助:EAS特殊数据权限-Java相关-Java相关-真格学网-IT技术综合网站
求助:EAS特殊数据权限
来源:本网整理
本文相关:
上一条:下一条:博客分类:
import java.util.regex.M
import java.util.regex.P
/** * 时间: *
* 作者:*/
public class T10_BianMa {
* java unicode 的相互转换
public T10_BianMa() {
public static void main(String[] args){
System.out.println(UnicodeToString("\u901F\u5EA6\u4E2D\u56FD"));
String chinese = "中华人民共和国";
for(int i = 0;i&chinese.length();i++){
System.out.print("\\u " + Integer.toHexString(chinese.charAt(i)));
//System.out.print(chinese.getBytes("Unicode")[i]);
System.out.println();
String str = "\u4e2d\u534e\u4eba\u6c11\uc\u56fd";
for(int j = 0;j&str.length();j++) {
System.out.println(str.charAt(j));
public static String UnicodeToString(String str) {
Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4 }))");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
ch = (char) Integer.parseInt(matcher.group(2), 16);
str = str.replace(matcher.group(1), ch + "");
将JDK的bin目录加入系统变量path。在盘下建立一个test目录,在test目录里建立一个zh.txt文件,文件内容为:“熔岩”,打开“命令行提示符”,并进入C:\test目录下。下面就可以按照说明一步一步来操作,注意观察其中编码的变化。
A:将zh.txt转换为Unicode编码,输出文件到u.txtnative2ascii zh.txt u.txt打开u.txt,内容为“\u”。B:将zh.txt转换为Unicode编码,输出到控制台 --Unicode输出文件C:\test&native2ascii zh.txt
\u可以看到,控制台输出了“\u”。C:将zh.txt转换为ISO8859-1编码,输出文件到i.txtnative2ascii -encoding ISO8859-1 zh.txt i.txt打开i.txt文件,内容为“\u00c8\u00db\u00d1\u00d2”。 D:将u.txt转换为本地编码,输出到文件u_nv.txt
--输出文件native2ascii -reverse u.txt u_nv.txt打开u_nv.txt文件,内容为“熔岩”。E:将u.txt转换为本地编码,输出到控制台C:\test&native2ascii -reverse u.txt 熔岩可以看到,控制台输出了“熔岩”。F:将i.txt转换为本地编码,输出到i_nv.txt
native2ascii -reverse i.txt i_nv.txt打开i_nv.txt文件,内容为“\u00c8\u00db\u00d1\u00d2”。发现转码前后完全一样的。也就是说,等于没有转,或者说思想糊涂,对命名没有理解。。
G:将i.txt转换为GBK编码,输出到i_gbk.txtnative2ascii -reverse -encoding GBK i.txt i_gbk.txt打开i_gbk.txt文件,内容为“\u00c8\u00db\u00d1\u00d2”。发现转码前后完全一样的。也就是说,等于没有转,或者说思想糊涂,对命名没有理解。
H:将u_nv.txt转码到本地编码GBK,输出到控制台 C:\test&native2ascii -reverse -encoding ISO8859-1 i.txt
熔岩从这个结果看,目标达到到了,编码i.txt为ISO8859-1,转为本地编码后内容为“熔岩”。从这里应该意识到,native2ascii -reverse命令中-encoding指定的编码为源文件的编码格式。而在native2ascii 命令中-encoding指定的编码为(生成的)目标文件的编码格式。这一点非常的重要!切记!!
继续探索,新建文件12a.txt,内容“12axyz”。看看纯字母数字的编码又如何。
I:将纯字母数字的文本文件12a.txt转换为Unicode编码native2ascii 12a.txt 12a_nv.txt打开12a_nv.txt文件,内容为“12axyz”。继续测试,转为ISO8859-1编码看看C:\test&native2ascii -encoding ISOa.txt12axyz结果还是没有转码。
//========================================================================
* 将字符串编码成 Unicode 。
* @param theString 待转换成Unicode编码的字符串。
* @param escapeSpace 是否忽略空格。
* @return 返回转换后Unicode编码的字符串。
public static String toUnicode(String theString, boolean escapeSpace) {
int len = theString.length();
int bufLen = len * 2;
if (bufLen & 0) {
bufLen = Integer.MAX_VALUE;
StringBuffer outBuffer = new StringBuffer(bufLen);
for(int x=0; x& x++) {
char aChar = theString.charAt(x);
// Handle common case first, selecting largest block that
// avoids the specials below
if ((aChar & 61) && (aChar & 127)) {
if (aChar == '\\') {
outBuffer.append('\\'); outBuffer.append('\\');
outBuffer.append(aChar);
switch(aChar) {
if (x == 0 || escapeSpace)
outBuffer.append('\\');
outBuffer.append(' ');
case '\t':outBuffer.append('\\'); outBuffer.append('t');
case '\n':outBuffer.append('\\'); outBuffer.append('n');
case '\r':outBuffer.append('\\'); outBuffer.append('r');
case '\f':outBuffer.append('\\'); outBuffer.append('f');
case '=': // Fall through
case ':': // Fall through
case '#': // Fall through
outBuffer.append('\\'); outBuffer.append(aChar);
if ((aChar & 0x0020) || (aChar & 0x007e)) {
outBuffer.append('\\');
outBuffer.append('u');
outBuffer.append(toHex((aChar && 12) & 0xF));
outBuffer.append(toHex((aChar &&
8) & 0xF));
outBuffer.append(toHex((aChar &&
4) & 0xF));
outBuffer.append(toHex( aChar
outBuffer.append(aChar);
return outBuffer.toString();
* 从 Unicode 码转换成编码前的特殊字符串。
* @param in Unicode编码的字符数组。
* @param off 转换的起始偏移量。
* @param len 转换的字符长度。
* @param convtBuf 转换的缓存字符数组。
* @return 完成转换,返回编码前的特殊字符串。
public String fromUnicode(char[] in, int off, int len, char[] convtBuf) {
if (convtBuf.length & len) {
int newLen = len * 2;
if (newLen & 0) {
newLen = Integer.MAX_VALUE;
convtBuf = new char[newLen];
char[] out = convtB
int outLen = 0;
int end = off +
while (off & end) {
aChar = in[off++];
if (aChar == '\\') {
aChar = in[off++];
if (aChar == 'u') {
// Read the xxxx
int value = 0;
for (int i = 0; i & 4; i++) {
aChar = in[off++];
switch (aChar) {
value = (value && 4) + aChar - '0';
value = (value && 4) + 10 + aChar - 'a';
value = (value && 4) + 10 + aChar - 'A';
throw new IllegalArgumentException(
"Malformed \\uxxxx encoding.");
out[outLen++] = (char)
if (aChar == 't') {
aChar = '\t';
} else if (aChar == 'r') {
aChar = '\r';
} else if (aChar == 'n') {
aChar = '\n';
} else if (aChar == 'f') {
aChar = '\f';
out[outLen++] = aC
out[outLen++] = (char) aC
return new String(out, 0, outLen);
private static final char[] hexDigit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
private static char toHex(int nibble) { return hexDigit[(nibble & 0xF)]; }
浏览 14268
这句什么意思呢?
浏览: 431174 次
来自: 北京
自己写的就是不一样.
吼,非常吼.学习了
我爱你 i love 你[color=red][/color] ...
大哥,目前这个问题有什么可靠的解决方案吗
说的很清楚,明白了~
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'c++里如何用string将中文编码的数字,字母转换成char类型
因公司业务需要,研究了一下c++里的string存储汉字的具体编码,完成了转换函数的编写,其实很简单。
ASCII 码是使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。 ASCII 编码可以表示的最大字符数年是 256,其实英文字符并没有那么多
ASCII-----单字节编码
ASCII 码是使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。 ASCII 编码可以表示的最大字符数年是 256,其实英文字符并没有那么多,一般只用前 128 个(最高位为了0),其中包括了控制字符、数字、大小写字母和其他一些符号。而最高为1 的另128 个字符为"扩展ACSII".
128 个字符,其中0x00~0x1F(0~31))、0x7F(127)是控制符。其他编码 0x20~0x7E(32~126)则定义实际可见的字符,包括数字、大小写英文字母、标点符号等。
GB2312-----中国人的简体字编码
GB年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从 A1-FE,占用的码位是72*94=6768.其中有5个空位是D7FA-D7FE.GB2312-80中共收录了7545个字符,用两个字节编码一个字符。每个字符最高位为0.
GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。
GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。
GBK----中国人的简繁编码
GBK编码(Chinese Internal Code Specification)是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。
范围:8140~FEFE(剔除xx7F)共23940个码位。GBK中有码位23940个,包含汉字21003个。
GBK 采用了单双字节混合的方式。它兼容ASCII,因些0x~07F 部分的定义和ASCII 一样。对其他字符,GBK中每个汉字仍然包含两个字节,第一个字节的范围是0x81-0xFE(即129-254)-----最高位必须是 1,第二个字节的范围是0x40-0xFE(即64-254)。
解码时,需要逐个字节检查具体如下:
  1.如果这个字节的范围是 0x00~0x7F,即最高位是 0 时,这个字节本身就代表一个字符,和 ASCII 的含义相同。  2.如果字节范围 0x80~0xFF,即最高位为 1 时,还需要再取下一个字节,两个字节合起来才表示一个字符。  Unicode----统一码、万国码,Java、Python
  Unicode编码后的大小是一样的。例如一个英文字母 "a" 和 一个汉字 "好",编码后都是占用的空间大小是一样的,都是两个字节!
  需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java.
  UTF-8-----国际编码,通用性好,前缀码,从第一个字节就能知道这是个几字节字
  因为对于英文字母,unicode也需要两个字节来表示。unicode不便于传输和存储,因此而产生了utf编码。
  UTF8编码后的大小是不一定,例如一个英文字母"a" 和 一个汉字 "好",编码后占用的空间大小就不样了,前者是一个字节,后者是三个字节!编码的方法是从低位到高位。
  其中UTF-16和Unicode编码大致一样, UTF-8就是以8位为单元对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
  Unicode编码(16进制) UTF-8 字节流(二进制)
  U+0000 - U+007F 0*** ****(0x00~0x7F) 字节最高位为了0,则它表示一个字符,和ASCII 解释一样
  U+0080 - U+07FF 110* **** 10** ****(0xC0~0xDF) 字节最高三位是110,则这是双字节 编码,用于其他字母字符
  U+0800 - U+FFFF 1110 **** 10** **** 10** ****(0xE0~0xEF) 字节最高四位是 1110, 则这是三字节编码,用于其他字符,如中文简繁等
  例如"汉"字的Unicode编码是6C49.6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx.将6C49写成二进制是: 001001, 用这个比特流依次代替模板中的x,得到:01,即E6 B1 89.
以上是相关资料…
为了方便查看解码方法,以下这个网址存储的是gb2312的中文编码:
在ASCII中,一共定义了128个字符,其中33个无法显示,为0~31和127,32到126为可显示字符,当使用cout输出一个char型字符时,如果是可显示范围内,则输出相应可显示字符,其余的都输出乱码。中文编码的话一个中文字使用两个字节存储,然而恰好中文编码的字符都在无法显示的ascll字节中,所以直接输出都无法查看。如果我们要使字符能够按十六进制输出方便我们查看以及编写程序,可以使用hex,但是发现cout
&& hex && data[0];没有输出十六进制,因为hex只对整数起作用,将s[0]转换为int,cout && hex && int(data[0]); 发现输出的结果前面带了很多f。因为data[0]是有符号数,最高位为1时,转换为int时,其余位都为1,cout && hex && (unsigned int) (unsigned char)data[0];结果正确。
现附上c++判断char是否为中文的代码:
int IncludeChinese(const char *str)
int nRet = 0;
while((c=*str++))
///如果字符高位为1且下一字符高位也是1则有中文字符
if( (c&0x80) && (*str & 0x80) )
下面附上判断返回中文编码字符的数字或者字母对应的ascll的编码格式的代码:
#include &iostream&
#include &string&
char get(char a)
unsigned int x=(unsigned int)(unsigned char)a;///首先需要得到该字节对应的具体编码数字
if(x&=176&&x&=185)///对照gb2312编码查找的中文编码数字
return x-176+'0';
if(x&=193&&x&=218)///对照gb2312编码查找的中文编码大写字母
return x-193+'A';
if(x&=225&&x&=250)///对照gb2312编码查找的中文编码小写字母
return x-193+'a';
return '0'-1;
string origin_str(string s)
string new_
for(int i=0,l=s.length(); i&l;)
if(s[i]&0x80&&s[i+1]&0x80)
///确定这两个字节是一个汉字编码字符然后具体在get()函数得到对应ascll字符
if(s[i]&0xA3)///第一个字节限定成了数字或者字母
char t=get(s[i+1]);///对照gb2312编码查找第二个字节具体是什么
new_str+=t;
new_str+=s[i],i++;
return new_
int main()
s="X024Y4089S9291929";
cout&&"string:"&&s&&"对应的效果为:";
string ss=origin_str(s);
cout&&ss&&
上面的字符串是用于测试用,所有的数字9都是正常的ascll编码,其他的都是中文编码的字符,转换后都是一样的ascll。啊,调试这个不知不觉搞到了现在…可是还是很兴奋吖!
没有更多推荐了,
不良信息举报
举报内容:
c++里如何用string将中文编码的数字,字母转换成char类型
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 eslint 指定目录 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信