C++国际化编程

这篇具有很好参考价值的文章主要介绍了C++国际化编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


字节和字符的区别

  • 字节(octet)是一个八位的存储单元,取值范围一定是0~255。而字符(character,或者word)为语言意义上的符号,范围就不一定了。例如在UCS-2中定义的字符范围为0~65535,它的一个字符占用两个字节。

Big Endian和Little Endian

字符0xabcd如果存储为 AB CD,则称为Big Endian;如果存储为 CD AB,则称为Little Endian。文章来源地址https://www.toymoban.com/news/detail-683475.html

字符集和编码关系

  • 一个字符集,它规定了每个字符对应的唯一字符码,却没有规定这个字符码在计算机中怎样存储。例如,汉字“一”,它的 Unicode 字符码为\u4e00,转换成二进制就是 100 1110 0000 0000 。可以看到,它有 15 位二进制数,至少需要两个字节来存储。
  • 于是UTF-32 编码 制定了标准,一个字符就用四个字节来表示。这样编码和解码都方便,固定取 32 位二进制就行了。

编码标准和字符集

  • 首先要注意:宽窄字符与UTF16,UTF8不是对应的关系
  • 多字节:有的编码方式采用 1~n 个字节存储,是变长的,例如UTF-8、GB2312、GBK 等;如果一个字符使用了这种编码方式,就将它称为多字节字符,或者窄字符。
  • 宽字节:有的编码方式是固定长度的,不管字符编号大小,始终采用 n 个字节存储,例如 UTF-32、UTF-16等;如果一个字符使用了这种编码方式,就将它称为宽字符。

Unicode字符集

  • Unicoide 的全称是 Universal Multiple-Octet Coded Character Set(通用多八位字符集,简称 UCS)。
  • Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值,这个值称为代码点(code point)。代码点的值通常写成 U+ABCD 的格式。而文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。顾名思义,UCS-2是用两个字节来表示代码点,其取值范围为 U+0000~U+FFFF。为了能表示更多的文字,人们又提出了UCS-4,即用四个字节表示代码点。它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。要注意,UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。
  • UTF-8、UTF-16、UTF-32都是字符编码,不是字符集。

ANSI标准

  • ANSI并不是某一种特定的字符编码,而是在不同的系统中,ANSI表示不同的编码。电脑卖给美国国内的系统默认就用ASCII编码,卖给中国人的系统默认就用GBK编码,卖给韩国人的系统默认就用EUC-KR编码,…但是为了避免误会系统功能有差异,就统一把默认编码都显示成ANSI。

编码

GB码

  • GBK、GB2321既是字符集,又是字符编码。GBK是GB2312的超集。

GB2312

  • GB2312对任意一个图形字符都采用两个字节表示,并对所收汉字进行了“分区”处理,每区含有 94
    个汉字/符号,分别对应第一字节和第二字节。

GBK

  • GBK的中文编码是双字节来表示的,英文编码是用ASCII码表示的,即用单字节表示。但GBK编码表中也有英文字符的双字节表示形式,所以英文字母可以有2种GBK表示方式。为区分中文,将其最高位都定成1。英文单字节最高位都为0。当用GBK解码时,若高字节最高位为0,则用ASCII码表解码;若高字节最高位为1,则用GBK编码表解码。

UTF码

UTF-8

  • UTF-8将0x0080以下字符编为1字节,0x0080-07FF字符编为2字节,0x0800以上字符编为3字节,代理对(surrogate pair)编为4字节。
  • ASCII字符是单个字节的,比如“A”的ASCII是65。而Unicode是双字节的,比如“A”的Unicode是0065,C语言使用‘\0’作为字符串结尾,这样一来,C语言的字符串函数将无法正常处理Unicode。在UTF-8里,英文字符仍然跟ASCII编码一样,因此原先的函数库可以继续使用。

UTF-16

  • UTF-16是完全对应于UCS-2的, 它将每个字符编码为两个字节,但2字节不足以表示某些语言的所有字符,于是UTF-16支持使用代理,可以使用4字节表示一个字符。UTF-16包括三种:UTF-16,UTF-16BE(Big Endian),UTF-16LE(Little Endian)。

UTF-32

  • UTF-32是完全对应于UCS-4的,它将所有字符都编码为4字节。

Unicode编程

ANSI字符 转 Unicode字符

//VS2019中的字符集选择Unicode字符集
//Windoes下ANIS转Unicode	ASIN一般是GB2312,GB18030,GBK等编码,Unicode一般是ucs-2或UTF-16
wchar_t* CharToWchar(const char* str) {
	if (str == 0)
		return 0;
	wchar_t* m_wchar;
	int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
	m_wchar = new wchar_t[len + 1];
	MultiByteToWideChar(CP_ACP, 0, str, -1, m_wchar, len);
	m_wchar[len] = '\0';
	return m_wchar;
}
int main(int argc, char* argv[]) {
	ifstream in("1.txt");//1.txt内容是: 中国,编码是gb2312
	string line;	
	if (in.is_open()) {
		getline(in, line);
		wstring wline = CharToWchar(line.c_str());
		wcout.imbue(locale("zh_CN"));
		wcout << wline << endl;
		/*wchar_t* wline = CharToWchar(line.c_str());
		setlocale(LC_CTYPE, "");
		wprintf(L"%s\n", wline);
		setlocale(LC_CTYPE, "C");*/ //C语言
	}
	system("pause");
	return 0;
}

到了这里,关于C++国际化编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot复习:(36)国际化

    一、Resources目录下建立一个目录(比如international)来存储资源文件 message.properties 空的,但不能没有 message_zh_CN.properties message_en_us.properties 二、自动配置类MessageSourceAutoConfiguration 常量MESSAGE_SOURCE_BEAN_NAME为messageSource,也就是有这个名字的bean,则自动配置失效。 因为有@Conditional(R

    2024年02月13日
    浏览(39)
  • 微信小程序国际化

    参考文件: 国际化(微信小程序+TS 微信小程序国际化 https://github.com/wechat-miniprogram/miniprogram-i18n 注意:一定要注意项目目录结构,新建文件夹miniprogram,并把前面新建的文件移到这个目录中 在NEW-FAN-CLOCK1 中安装根目录依赖 在NEW-FAN-CLOCK1 / minprogram 中安装依赖 1、初始化仓库: 一

    2023年04月26日
    浏览(31)
  • vue2+element-ui使用vue-i18n进行国际化的多语言/国际化

    注意:vue2.0要用8版本的,使用9版本的会报错 在src目录下,创建新的文件夹,命名为i18n zh.js en.js index.js main.js 使用方式一 效果图 使用方式二 效果图 使用方式三,在 效果图 ` 注意:这种方式存在更新this.$i18n.locale的值时无法自动切换的问题,需要刷新页面才能切换语言。解

    2024年02月07日
    浏览(55)
  • Spring MVC(三) 国际化

    随着全球化的加速发展,Web应用的多语言支持变得越来越重要。对于开发者来说,如何实现应用的国际化成为了一个不可忽视的问题。作为Java Web开发的重要框架,Spring MVC在处理国际化方面有着丰富的功能和灵活的解决方案。本文将探讨Spring MVC的国际化部分内容,并通过自己

    2024年01月18日
    浏览(38)
  • Spring Boot实现国际化

    config controller 在Thymeleaf模板中引用国际化消息:

    2024年01月23日
    浏览(35)
  • 第七十一回:国际化设置

    我们在上一章回中介绍了Card Widget相关的内容,本章回中将介绍 国际化设置 .闲话休提,让我们一起Talk Flutter吧。 我们在这里说的国际化设置是指在App设置相关操作,这样可以让不同国家的用户使用App时呈现不同的语言。总之,就是通过相关的操作,让App支持多个国家的语言

    2024年02月11日
    浏览(48)
  • Android国际化各国语言简写

    2024年02月16日
    浏览(38)
  • 如何优雅的实现前端国际化?

    JavaScript 中每个常见问题都有许多成熟的解决方案。当然,国际化 (i18n) 也不例外,有很多成熟的 JavaScript i18n 库可供选择,下面就来分享一些热门的前端国际化库! i18next 是一个用 JavaScript 编写的全面的国际化框架,提供标准的 i18n 功能,包括复数、上下文、插值、格式等。

    2024年01月23日
    浏览(45)
  • Flutter GetX 之 国际化

    今天给大家介绍一下 GetX 的国际化功能,在日常开发过程中,我们经常会使用到国际化功能,需要们的应用支持 国际化,例如我们需要支持 简体、繁体、英文等等。 上几篇文章介绍了GetX的 路由管理 和 状态管理,看到大家的点赞和收藏,还是很开心的,说明这两篇文章给大

    2024年01月19日
    浏览(50)
  • Android 实现资源国际化(多语言)

    目录 一、介绍 二、字符串资源 三、图片资源 四、日期和时间格式 五、其他 六、应用内切换语言 七、资源文件命名规则         Android国际化(多语言)是一种开发技术,旨在使Android应用程序能够在 「不同语言和文化环境」 下运行,并为用户提供本地化的体验。这是为了

    2024年02月04日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包