unicode character set

为了不忘记以前看过的unicode规范。决定写此文章,以便于记忆。

UCS 4

 byte1 首位为0, 2^7=128个group

 byte2 2^8=256个plane

 byte3 256 row

 byte4 256 cell

group 0 plane0 为Basic Multilingual Plane (BMP).

BMP去掉前面的两个字节 就等同于 UCS 2.


Now Unicode 使用了17个plane, 一个 17*2^16个codepoint.

平面15 0xF0000 - 0xFFFFD

平面16 0x100000 - 0x10FFFD

这两个平面定义了大约2^17个码位,作为Private Use Area. PUA给大家自定义。


java里面的string是适用UTF16来表示的。

这里可以看出,BMP里面的字符码点小于2^16,完全可以使用两个字节表示。


BMP以外的字符如何来表示?BMP以外的字符的码点大于2^16,只能使用2个UTF16单位。

怎么区分BMP和BMP以外的字符?在BMP中,保留了0xE000 - 0xF8FF 0xD800-0xDFFF作为代理区。

使用代理区+一个UTF16单元,表示一个BMP以外的字符。


UTF8,16,32都是一种编码转换格式。


在java中,String使用UTF16编码格式。使用codepointAt(offset)来得到offset字符处的unicode码,

如果codepoint大于2^16,说明此处字符需要使用2个UTF16单元。

String str = "XXXXXX";

int i = 0;

while (i < str.length()) {

   // 此处字符的unicode码点

   int codepoint = str.codepointAt(i);

   if (codepoint >= 0x100000000) {

       // 此字符占用2个UTF16单元。跳过一个字符。

       i++;

   }

   i++

}

转载于:https://my.oschina.net/xpbug/blog/53137

<think>好的,我现在需要帮助用户解决MFC项目中的编译错误MSB8031,也就是关于非Unicode字符集被弃用的问题。首先,我得回顾用户提供的引用内容和之前的对话历史,确保给出的解决方案准确且全面。 首先,用户提到的错误信息显示,使用非Unicode字符集构建MFC项目已被弃用。微软现在推荐使用Unicode字符集,所以解决方法要么是转换项目到Unicode,要么安装额外的库来支持多字节字符集。根据引用[2],安装vc_mbcsmfc可以解决这个问题,但用户可能需要知道具体的下载和安装步骤。 接下来,我需要考虑用户可能的场景。用户可能是一个正在维护旧项目的开发者,项目原本使用的是多字节字符集,现在升级到新版本的Visual Studio后遇到了问题。他们可能不想立即转换到Unicode,因为这可能涉及大量代码修改,或者需要保持与旧系统的兼容性。因此,用户可能更倾向于安装额外的库来快速解决问题,但同时也要提供转换到Unicode的步骤,供用户选择最适合的方案。 另外,用户之前的问题是关于C++控制台暂停的方法,这可能意味着他们正在处理一个涉及用户界面和控制台交互的项目,但当前的问题更偏向于项目配置和构建系统。需要确保回答结构清晰,分步骤说明,便于用户跟随操作。 然后,我需要检查解决方案的可行性。转换项目属性到Unicode是官方推荐的长期解决方案,但可能涉及修改代码中的字符串处理部分,例如将char改为wchar_t或使用TCHAR宏。而安装vc_mbcsmfc则是临时解决方案,适用于需要继续使用多字节字符集的情况。但根据微软的弃用通知,未来可能不再支持,所以最好建议用户尽量迁移到Unicode。 同时,引用[3]提到的错误MSB8020可能也会出现,尤其是在用新版本VS打开旧项目时,可能需要升级平台工具集。虽然用户当前的问题是关于MSB8031,但可能需要一并考虑平台工具集的设置,确保项目配置正确。例如,用户可能需要将平台工具集从v100升级到当前版本,或者安装旧版本的构建工具。 另外,需要提供具体的步骤,例如如何在Visual Studio中修改项目属性,如何安装vc_mbcsmfc组件,以及如何检查字符集设置。用户可能不熟悉VS的设置界面,所以步骤要详细,包括菜单导航路径和选项的位置。 还需要注意,用户可能在操作过程中遇到其他问题,比如下载链接失效,或者安装后需要重启VS等,应该在注意事项中提及这些可能性,减少用户的困惑。 最后,生成的相关问题需要覆盖用户可能遇到的后续问题,例如如何批量转换字符串到Unicode,如何处理转换后的兼容性问题,以及如何升级项目到新工具集等。这有助于用户全面了解相关主题,自助解决其他潜在问题。 总结来说,我需要分步骤提供两种解决方案:转换为Unicode和安装多字节支持库,并比较它们的优缺点,帮助用户做出选择。同时,补充相关注意事项和常见问题解答,确保用户能够顺利解决问题。</think>针对MFC项目编译错误MSB8031的解决方案可分为以下两个方向: --- ### 一、**迁移至Unicode字符集(推荐长期方案)** #### 步骤1:修改项目属性 1. 右键项目 -> 属性 -> 常规 -> 字符集 -> 改为"使用Unicode字符集" 2. 确认"高级"选项卡中的"字符集"也设置为Unicode[^1] #### 步骤2:代码适配 1. 将`char*`替换为`wchar_t*`或`TCHAR*` 2. 字符串字面量前加`L`或使用`_T()`宏: ```cpp MessageBox(_T("多语言文本")); // 使用TCHAR兼容宏 CString str = L"Unicode文本"; // 显式使用宽字符 ``` #### 优势: - 符合微软最新开发规范 - 原生支持多语言显示 - 避免未来版本兼容性问题[^1] --- ### 二、**安装多字节字符集支持(临时过渡方案)** #### 步骤1:安装VC++ MBCS MFC组件 1. 打开Visual Studio Installer 2. 选择当前VS版本 -> 修改 -> 单个组件 3. 搜索并勾选: - **VC++ 2013 MBCS MFC** - **VC++ 2013 MBCS MFC for v142工具集**(根据VS版本选择)[^2] #### 步骤2:验证安装 ```xml <!-- 检查.vcxproj文件是否包含 --> <PropertyGroup> <CharacterSet>MultiByte</CharacterSet> </PropertyGroup> ``` --- ### 三、**方案对比** | 标准 | Unicode迁移方案 | 多字节安装方案 | |--------------------|------------------------|----------------------| | 长期维护成本 | 低(符合新标准) | 高(面临后续淘汰) | | 代码修改量 | 中(需调整字符串处理) | 无 | | 多语言支持 | 原生完美支持 | 需手动转换编码 | | 系统兼容性 | Win10/Win11全支持 | 旧系统兼容性更好 | --- ### 四、**常见问题处理** 1. **残留编译错误MSB8020**: - 升级平台工具集:项目属性 -> 常规 -> 平台工具集 -> 选择当前VS版本工具集 - 或安装旧版构建工具[^3] 2. **字符串转换示例**: ```cpp // char* 转 wchar_t* size_t converted = 0; wchar_t wstr[256]; mbstowcs_s(&converted, wstr, "ANSI文本", _TRUNCATE); ``` --- ### 五、**注意事项** 1. 使用Unicode后,文件路径需用`wmain`替代`main`: ```cpp int wmain(int argc, wchar_t* argv[]) ``` 2. 第三方库需确认提供Unicode版本 3. 注册表操作需使用`RegOpenKeyExW`等宽字符API
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值