目前共有8篇帖子。 内容转换:不转换▼
 
点击 回复
439 7
【示例】在C语言中的char字符数组中处理双字节中文字符
一派护法 十九级
1楼 发表于:2015-12-11 12:48
#include <conio.h>
#include <stdio.h>

void main()
{
    char str[9] = "简体中文";
    char str2[8] = {'简' >> 8, '简' & 0xff, '体' >> 8, '体' & 0xff, 'A' , 'B', 'C', '\0'};
    puts(str);
    puts(str2);
    str[0] = '繁' >> 8;
    str[1] = '繁' & 0xff;
    puts(str);
    _getch();
}

输出:
简体中文
简体ABC
繁体中文
一派护法 十九级
2楼 发表于:2015-12-11 12:49
以上程序是在VS2012中编写的。
如果要在VC6中运行,那么还得加上类型强制转换,把int转换为char,例如:
str[0] = (char)('繁' >> 8);
str[1] = (char)('繁' & 0xff);
一派护法 十九级
3楼 发表于:2015-12-11 12:51
还有另一种修改char字符串中单个汉字的方法:
str[2] = '體' / 0x100;
str[3] = '體' % 0x100;
结果:繁體中文
一派护法 十九级
4楼 发表于:2015-12-11 12:53
在char字符数组中,汉字的高八位和低八位分别占一个数组元素。
取汉字高八位的方法是将汉字常量右移8位,把低八位移出去,或者除以0x100。
取低八位的方法是将汉字常量与0xff作按位与运算去掉高八位,或者直接取0x100的余数。
一派护法 十九级
5楼 发表于:2015-12-11 12:54
2楼所示的方法只使用位运算,不使用除法运算,所以该方法效率要高些。
一派护法 十九级
6楼 发表于:2015-12-11 13:00
为了方便起见,可以定义两个宏:HIGH和LOW。例如:
#include <conio.h>
#include <stdio.h>

#define LOW(c) (char)(c & 0xff)
#define HIGH(c) (char)(c >> 8)

void main()
{
    char str1[] = {'E', 'n', 'g' ,'l', 'i', 's', 'h', '\0'}; // 这是一个普通的字符数组
    char str2[] = {HIGH('简'), LOW('简'), HIGH('体'), LOW('体'), HIGH('中'), LOW('中'), HIGH('文'), LOW('文'), '\0'}; // 这是一个含有汉字的字符数组
    puts(str1);
    puts(str2);
    str1[0] = 'F';
    puts(str1);
    str2[0] = HIGH('繁');
    str2[1] = LOW('繁');
    puts(str2);
    _getch();
}

输出:
English
简体中文
Fnglish
繁体中文
202.115.90.*
7楼 发表于:2015-12-11 15:54
VC++6下编译1楼的程序:
#include <stdio.h>

void main()
{
char str[9] = "简体中文";
char str2[8] = {'简' >> 8, '简' & 0xff, '体' >> 8, '体' & 0xff, 'A' , 'B', 'C', '\0'};
puts(str);
puts(str2);
str[0] = '繁' >> 8;
str[1] = '繁' & 0xff;
puts(str);
}
出现的警告信息:
--------------------Configuration: ccccc - Win32 Debug--------------------
Compiling...
sadsaad.c
d:\ccccc\sadsaad.c(6) : warning C4305: 'initializing' : truncation from 'const long ' to 'char '
d:\ccccc\sadsaad.c(6) : warning C4305: 'initializing' : truncation from 'const int ' to 'char '
d:\ccccc\sadsaad.c(6) : warning C4305: 'initializing' : truncation from 'const long ' to 'char '
d:\ccccc\sadsaad.c(6) : warning C4305: 'initializing' : truncation from 'const int ' to 'char '
d:\ccccc\sadsaad.c(9) : warning C4305: '=' : truncation from 'const long ' to 'char '
d:\ccccc\sadsaad.c(10) : warning C4305: '=' : truncation from 'const int ' to 'char '
Linking...

ccccc.exe - 0 error(s), 6 warning(s)


所以必须进行强制类型转换。
202.115.90.*
8楼 发表于:2015-12-11 15:56
修改后的程序:
#include <stdio.h>

void main()
{
char str[9] = "简体中文";
char str2[8] = {(char)('简' >> 8), (char)('简' & 0xff), (char)('体' >> 8), (char)('体' & 0xff), 'A' , 'B', 'C', '\0'};
puts(str);
puts(str2);
str[0] = (char)('繁' >> 8);
str[1] = (char)('繁' & 0xff);
puts(str);
}

在VC++6中的编译信息:
--------------------Configuration: ccccc - Win32 Debug--------------------
Compiling...
sadsaad.c
Linking...

ccccc.exe - 0 error(s), 0 warning(s)

运行结果:
简体中文
简体ABC
繁体中文
Press any key to continue

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:439 回复数:7
评论数: ?
作者:巨大八爪鱼
最后回复:202.115.90.*
最后回复时间:2015-12-11 15:56
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。