c++使用icu国际化(i18n)

news2024/11/19 4:23:06

icu

International Components for Unicode,https://github.com/unicode-org/icu.git
https://icu.unicode.org/
帮助文档:
https://unicode-org.github.io/icu/userguide/icu/howtouseicu.html

  • i18n,Internationalization (in/i18n) library
  • io,Ustdio/iostream library (icuio),c++读取文件是ansi的需要编码转换,使用icu、u_fopen可以读取unicode

编码检测

/*
 * data,    传入参数, 需要探测的字符串
 * len,     传入参数, 探测字符串长度
 * detected  传出参数, 探测的最有可能的字符编码名称, 调用者需要释放该字段
**/
bool detectTextEncoding(const char *data, int32_t len, char **detected) {
    UCharsetDetector *csd;
    const UCharsetMatch **csm;
    int32_t match, matchCount = 0;

    UErrorCode status = U_ZERO_ERROR;

    csd = ucsdet_open(&status);
    if (status != U_ZERO_ERROR)
        return false;

    ucsdet_setText(csd, data, len, &status);
    if (status != U_ZERO_ERROR)
        return false;

    csm = ucsdet_detectAll(csd, &matchCount, &status);
    if (status != U_ZERO_ERROR)
        return false;

#if 0 //打印出探测的可能的编码
    for(match = 0; match < matchCount; match += 1)
    {
        const char *name = ucsdet_getName(csm[match], &status);
        const char *lang = ucsdet_getLanguage(csm[match], &status);
        int32_t confidence = ucsdet_getConfidence(csm[match], &status);

        if (lang == NULL || strlen(lang) == 0)
                lang = "**";

        printf("%s (%s) %d
", name, lang, confidence);
    }
#endif

    if (matchCount > 0) {
        *detected = strdup(ucsdet_getName(csm[0], &status)); //分配了内存, 需要释放
        if (status != U_ZERO_ERROR)
            return false;
    }

    printf("charset = %s
", *detected);

    ucsdet_close(csd);
    return true;
}

编码转换

/*
 * toConverterName,      转换后的字符编码
 * fromConverterName,    转换前的字符编码
 * target,               存储转换后的字符串, 传出参数
 * targetCapacity,       存储容量,target的大小
 * source,              需要转换的字符串
 * sourceLength,         source的大小
**/
int convert(const char *toConverterName, const char *fromConverterName,
            char *target, int32_t targetCapacity, const char *source, int32_t sourceLength) {
    UErrorCode error = U_ZERO_ERROR;
    ucnv_convert(toConverterName, fromConverterName, target, targetCapacity, source, sourceLength, &error);

    return error;
}
conv = ucnv_open("iso-8859-3", &status);
/* Convert from ISO-8859-3 to Unicode */
len = ucnv_toUChars(conv, target, targetSize, source, sourceLen, &status);
ucnv_close(conv);

i18n国际化

resouce tree structure:
在这里插入图片描述
c打开resource

UErrorCode status = U_ZERO_ERROR;
UResourceBundle* icuRoot = ures_open(NULL, "root", &status);
if (U_SUCCESS(status)) {
	//ures_getStringByKey
	ures_close(icuRoot);
}

c++打开resource

UErrorCode status = U_ZERO_ERROR;
// we rely on automatic construction of Locale object from a char*
ResourceBundle myResource("myPackage", "de_AT", status); 
if (U_SUCCESS(status)) {
}

查询key

UResourceBundle *zones = ures_getByKey(icuRoot, "zoneStrings", NULL, &status);
	if (U_SUCCESS(status)) {
		ures_close(zones);
	}

bundle file

root {
    menu {
        id { "mainmenu" }
        items {
            {
                id { "file" }
                name { "&File" }
                items {
                    {
                        id { "open" }
                        name { "&Open" }
                    }
                    {
                        id { "save" }
                        name { "&Save" }
                    }
                    {
                        id { "exit" }
                        name { "&Exit" }
                    }
                }
            }
        }
   }
}

生成binary resouce bundlefile

genrb -d dest_dirname root.txt en.txt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第五章:开机,重启和用户登录注销-[实操篇]

一&#xff1a;开机&重启命令 1.1基本介绍 shutdown shutdown -h now&#xff1a;表示立即关机 shutdown -h 1 : 表示1分钟后关机 shutdown -r now : 立即重启 halt 就是直接使用&#xff0c;效果等价于关机 reboot 就是直接使用&#xff0c;效果等价于关机 syn &…

uTools V3.3.0 效率工具集

前言 uTools是一款基于electron开发的工具集软件&#xff0c;通过快捷唤醒搜索&#xff0c;直接打开各种功能&#xff0c;非常方便。 uTools uTools是一个极简、插件化、跨平台的现代化桌面软件。通过自由选配丰富的插件&#xff0c;打造你得心应手的工具集合。 通过快捷键…

制作gltf动态夜景模型

kele 前言 要制作一个充满科技感的场景&#xff0c;离不开动画特效。众所周知&#xff0c;Unity软件可制作各种炫酷动画效果&#xff0c;如果将Unity中的动画添加到WebGL网页项目中&#xff0c;那一定会非常美妙吧~接下来小编将介绍如何通过Unity制作纹理动画&#xff0c;并导…

RISC-V IDE MRS使用笔记(七) :常用开发技巧汇总

RISC-V IDE MRS使用笔记(七) &#xff1a;常用开发技巧汇总 Q1: MRS调试时如何查看外设寄存器内容&#xff1f; A1: 在调试配置界面添加相应的.svd文件。 Q2: MRS如何调用数学库? A2: #include ”math.h”头文件,并在工程属性页面增加”m”参数。 Q3: 如何设置MRS调试前默认…

还在对比IT培训机构,行内人告诉你怎么比?

还在对比IT培训机构&#xff0c;行内人告诉你怎么比&#xff1f;因为身处IT培训行业6年多点时间 &#xff0c;从讲师到校区经营的成长履历中。见识过众多机构的运营和发展&#xff0c;当然也包含我所在的正厚软件。平时在知乎上看的多&#xff0c;自然推荐的关于机构对比的话题…

蓝牙无线运动耳机排行榜、口碑最好的运动蓝牙耳机推荐

越来越多的人开始喜欢蓝牙耳机的便携性&#xff0c;尤其对于运动的慢跑族&#xff0c;蓝牙耳机更为方便携带和佩戴&#xff0c;毕竟没有了线束的烦恼&#xff0c;目前蓝牙耳机市场很大&#xff0c;用户人群很多&#xff0c;我体验过的这类产品比较多&#xff0c;如何挑选一款满…

MySQL5.7安装配置教程-Windows(企业常用版)超详细

引言 MySQL 5.7 为公司、企业常用的MySQL版本。 正在学习或正在工作的小伙伴推荐相关教程按照5.7的版本来学习、操作。 1. 下载MySQL 阿里云盘不限速高速下载地址&#xff1a; https://www.aliyundrive.com/s/YTMa5LfSFB2 因为阿里云盘不支持zip压缩包的分享&#xff0c;我用…

【财务】FMS财务管理系统---应付结算

本篇文章中&#xff0c;笔者对应付结算各个部分进行了梳理和分析&#xff0c;与大家分享。 前面相继介绍了财务系统的组成、财务数据流转、应收管理、质保金、预付款、费用管理以及合同管理。 我个人觉得应付结算管理部分的逻辑是整个FMS财务管理系统中较为复杂的一部分&#…

APP测试面试题汇总

一、基础篇 1、请介绍一下&#xff0c;APP测试流程&#xff1f; APP测试流程与web测试流程类似&#xff0c;分为如下七个阶段&#xff1a; 1.根据需求说明书编写测试计划&#xff1b; 2.制定测试方案&#xff0c;主要是测试任务、测试人员和测试时间的分配&#xff1b; 3.…

Vue3 Composition API: 对比ref和reactive

Vue2 回顾 首先回顾一下在Vue2中我们是如何创建一个响应式数据 (reactive data)的&#xff1a; Vue3新特性 ref的使用 而在Vue3中&#xff0c;我们可以用Composition API: ref 来改写上述代码&#xff1a; ref 的作用就是将一个原始数据类型&#xff08;primitive data t…

NPM 2FA双重认证的设置方法

NPM在使用用户名和密码登录后&#xff0c;他觉得还不是很安全&#xff0c;需要用一个手机软件来生成一个随机验证码&#xff0c;两者同步&#xff0c;来做二次验证。类似于手机银行的优盾或者验证码验证。 双重验证&#xff1a;标准验证方法&#xff0c;其中一个因素是密码。 …

gdb调试跟踪代码

编译 用gcc/g编译源程序的时候&#xff0c;编译后的可执行文件不会包含源程序代码&#xff0c;如果要使用gdb调试的话&#xff0c;编译的时候要加 -g 的参数。 gcc test.c -o test -g调试 gdb test常用命令&#xff1a; &#xff08;gdb&#xff09;help&#xff1a;查看命令…

jira-dev-tool插件安装失败的解决方法

最近&#xff0c;在运行【React React Hook TS 最佳实践仿 Jira 企业级项目】的时候&#xff0c;安装jira-dev-tool 插件出现问题&#xff0c;参考&#xff1a;https://www.npmjs.com/package/jira-dev-tool。解决方法&#xff1a;在项目中执行&#xff1a; npx msw init pu…

Layer2 实现方式之 Rollup

一. 1. Rollup 简介 Rollup 是类似于 Plasma 的第 2 层扩展解决方案&#xff1a;单个主链合约持有所有资金和对更大“侧链”状态&#xff08;通常是账户、余额及其状态的 Merkle 树&#xff09;的简洁加密承诺。侧链状态由链下用户和运营商维护&#xff0c;不依赖 L1 存储&…

C语言文件读写

上一章我们讲解了 C 语言处理的标准输入和输出设备。本章我们将介绍 C 程序员如何创建、打开、关闭文本文件或二进制文件。 一个文件&#xff0c;无论它是文本文件还是二进制文件&#xff0c;都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数&#xff0c;也提供了底层…

linux------基本操作指令(1)

1)JAVA是一个跨平台的编程语言&#xff0c;多线程编程&#xff0c;网络编程在JAVA标准库里面本身就有 2)C的标准库相比于JAVA的标准库还是要弱一些&#xff0c;网络编程已经不支持了 3)linux是世界上第一大操作系统 李纽克斯 李娜克斯 李呢克斯 李妮克斯 一:背景知识 1)内网I…

串口监听:以共享模式打开端口CreateFile,居然无法再打开?但文件可以。

想以共享模式来监听串口 结果打开失败&#xff0c;错误5 拒绝访问。为什么呢&#xff1f; 但是文件却正常 看了两个监听串口的软件bus hound和commMonitor都是需要驱动才能实现 单纯共享打开&#xff0c;可以无法监听串口&#xff0c;那学习一下windows驱动吧。 windows驱动 …

为加快项目开发进度,如何快速合理分配开发任务?

1、对任务进行合理分类 软件开发项目&#xff0c;任务繁多&#xff0c;需要对任务进行分类&#xff0c;以便优先完成重要任务。一般最常规的方法是时间四象限法&#xff0c;即按照重要和紧急程度对任务进行划分&#xff1a;重要紧急、重要不紧急、紧急不重要、不重要不紧急四类…

UE4 Shader 常用函数 学习笔记

Add&#xff1a;快捷键a 将两数相加&#xff0c;也可以将两纹理相加&#xff0c;如下图&#xff1a; append&#xff08;追加&#xff09;&#xff1a; Subtract&#xff08;减&#xff09;&#xff1a; 和加相反&#xff0c;特例&#xff0c;如下&#xff1a; Abs&#xff0…

企业需要防范的 6 个常见身份攻击手段|身份云研究院

零信任作为新一代的网络安全防护理念&#xff0c;已经成为全球网络安全管理的基石。零信任的核心是 「安全体系架构从网络中心化走向身份中心化」&#xff0c;「以身份为中心」的网络访问控制理念也逐渐被越来越多企业接受并实践。 然而企业在面向用户身份访问和管理的实践中还…