在iconvlib库中 ucs-4-internal 如何理解?

iamluda 2009-03-30 09:10:33
在网上查到下面一句话:
使用libiconv来进行各种编码方式之间转化。 编译器里的unicode通常是ucs-2-internal和ucs-4-internal。

请问 ucs-4-internal的含义是什么?
...全文
333 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamluda 2009-03-30
  • 打赏
  • 举报
回复
下面的文章引用自 http://www.cnblogs.com/waterflier/archive/2005/11/10/272996.html

在windows下面编程,我们通常都知道unicode这个概念,如果一个程序是unicode的,那么他将调用

unicode的api。这个时候,所有传递给api的字符串参数都要是unicode的.如果使用C的风格,是很简单的

,字符串全部由char* str 转变成TCHAR* str,使用的crt函数(其实也是api)时调用_tcslen类的函数族就

可以了。

在讨论其它问题前要先明确一个概念:unicode 与 utf-8编码,utf-16编码是两个不同类别的术语。

unicode对一个字符提供了一个唯一的编码(参看下面的资料,关于UCS-2与UCS-4)
假设"中"这个字符的编码是0x34 0x34(我乱写的),utf-8对其编码,得到的是 0xE3 0x90 0xB6 需要3byte

的空间进行存储。不同的unicode码经过utf-8编码后会得到变长的结果.比如说'a'经过utf-8编码后得到

的是和ascii码相同,只占1个byte.对unicode使用不同的方法编码,可以有效的节约存储空间(如果选择了

错误的编码,会浪费空间).

中的unicode(UCS-2)值和编码后的结果
unicode utf-8
00110100 00110100 11100011 10010000 10110110
a的unicode值和编码后的结果
unicode utf-8
00000000 01100001 01100001

这里得出的结论是utf-8,utf-16编码是在存储字符串信息前的一个选择,而不是处理字符串的选择.

OK,问题回到字符串编程上来。第一个问题,就是要选择内存中的字符串格式,包括自己所有需要传递字

符串参数的函数的参数定义。我们这里有3个选择,char*(ASCII string),unsigned short*(UCS2

string,windows下的unicode),unsigned long*(UCS4 string,真正的unicode支持)。
windows下的api是不支持UCS4的,所以在windows平台下最好只做前2个的选择。类似于windows的TCHAR定义,我们可以做这样

的定义
#ifdef _UCS2
#define TCHAR unsigned short
#else
#ifdef _UCS4
#define TCHAR unsigned long
#else
#define TCHAR char
#endif
#endif
然后有一个问题,如果在程序中需要使用一个预定义的字符串,比如说
TCHAR* str = "中国";
那么,str指向的常量字符串的编码是ACSII string,还是UCS2 unicode string,还是UCS4 unicode

string,是取决于编译器的。这样就容易造成许多不易发现的错误。这里要推荐一个string table的概念

,用如下代码替换。
const TCHAR* str = StringTable::LoadStr(ID_HOMELOAD_NAME);
StringTable类解析一个指定编码的本地字符串表XML文件(可以用各种编码存储),这个文件可以使用自定

义的工具或则是各种XML编辑工具来生成。使用StringTable::SetOutPutType(enum MemStrType)来使之在

LoadStr的时候转成各种字符串编码。当然,这个类中定义了一系列的编码转换函数,比如说

UTF8TOASCII,UTF8TOUCS2,UTF8TOUCS4,UCS4TOUCS2,UCS4TOASCII,UCS4TOXXX,StringTalbe内部使用UCS4作

为读取后的字符串存储格式,然后再根据StringTable::SetOutPutType指定的输出类型生成相应编码的

Table.这样做的好处就是把这个编码的问题重视化,即时出现编码不一致的错误,也能立刻修正。

在linux下,系统对UCS4的支持比较好,#include<wchar.h>,里面的函数的接口都是ucs4 string.所以如果写跨平台程序,肯定是要用ucs2的(UCS4windows不支持,而且可以节约内存,但是你的程序就不是真正的UNICODE3.1 Support了,而且也不能支持国家标准GB18030).然后再调用linux的相关函数时,转化为UCS4.参考文章http://www0.ccidnet.com/tech/os/2001/07/31/58_2811.html。我懒得写了。

  • 打赏
  • 举报
回复
UTF8并不算是一种电脑编码,而是一种储存和传送的格式,如前所述,每个Unicode/UCS字符都以 2或4个bytes来储存,看看以下的比较:

  以"I am Chinese"为例
   用ANSI储存:12 Bytes
   用Unicode/UCS2储存:24 Bytes + 2 Bytes(header)
   用UCS4储存:48 Bytes + 4 Bytes(header)

  以"我是中国人"为例
   用ANSI储存:10 Bytes
   用Unicode/UCS2储存:10 Bytes + 2 Bytes(header)
   用UCS4储存:20 Bytes + 4 Bytes(header)
iamluda 2009-03-30
  • 打赏
  • 举报
回复
iconv_open - 分配一个字符集转换的描述符

iconv_open 函数 分配 一个 用于 把 fromcode 编码的 字符串 转换成 tocode编码 的 转换 描述符.

fromcode 和 tocode 所允许的值 以及 支持的 组合方式 都是 与 系统 相关的.
对于 这个 libiconv 库, 它 支持 下面 的 编码, 也 支持 其 所有 的 组合.

例如:
iconv_t cd;
cd = iconv_open("UTF-8", "GB2312"); /* 将GB2312字符集转换为UTF-8字符集 */

请问下面这个代码如何理解:
iconv_open("UCS-4-INTERAL","UCS-2LE")
内容概要:本文系统研究了基于豪猪优化算法(CPO)的多无人机协同集群在三维空间中的避障路径规划问题,聚焦于实现以最低成本为目标的航迹优化,综合考虑路径长度、飞行高度、威胁规避及转弯角度等多个关键因素。通过构建精细化的三维环境模型与多无人机协同机制,采用Matlab平台实现CPO算法的仿真与验证,充分展示了该算法在复杂动态障碍环境下的高效搜索能力与全局优化性能。研究不仅涵盖了路径规划的数学建模与目标函数设计,还深入探讨了算法的收敛特性与鲁棒性,为智能群体系统在实际场景中的应用提供了理论依据与技术支撑。; 适合人群:具备一定编程基础和优化算法背景,从事无人机系统控制、智能路径规划、群体协同、人工智能与自动化等相关领域的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于多无人机协同执行侦察、灾害监测、应急救援、区域巡检等复杂任务中的自主路径规划;②为智能优化算法在三维动态环境下的路径决策问题提供可复现的技术范例;③支持研究人员对CPO算法与其他主流群智能算法(如PSO、GWO、WOA等)进行性能对比与改进研究,推动路径规划技术的发展。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解目标函数的多维度建模方式与CPO算法的迭代优化流程,可通过调整环境参数与约束条件进行仿真实验,对比不同算法在相同场景下的路径质量与收敛速度,从而深入掌握其优势与适用边界。
内容概要:本文围绕电动汽车参与电力系统运行备用的能力评估展开深入研究,利用Matlab代码实现对电动汽车集群提供运行备用服务的建模与仿真分析。研究重点在于量化电动汽车作为分布式灵活资源参与电网辅助服务的潜力,通过构建精细化的数学模型,分析其可调功率容量、响应速度、时空分布特性及聚合能力,并采用多面体聚合、内近似模型与闵可夫斯基和等先进方法精确刻画其可调度能力边界。研究进一步结合大规模电动汽车接入场景,探讨其在多时间尺度调度框架下参与调峰、调频等辅助服务的优化策略,评估其对提升高比例可再生能源电网灵活性与稳定性的贡献,最终通过仿真验证所提模型与方法的有效性与实用性。; 适合人群:具备电力系统分析、智能电网、新能源汽车或优化调度等相关专业背景,熟悉Matlab/Simulink仿真工具,从事科研、工程应用的高校研究生、科研人员及电力行业工程师。; 使用场景及目标:①精确评估大规模电动汽车集群在不同约束条件下可提供的运行备用容量;②研究电动汽车在日前、日内及实时调度中的动态响应能力与优化调度策略;③为高渗透率新能源电力系统提供基于移动储能的灵活性资源解决方案,支撑电网安全经济运行。; 阅读建议:建议结合Matlab代码与技术文档同步学习,重点关注多面体聚合建模、能力边界计算及优化调度算法的设计与实现,可进一步拓展至V2G(车辆到电网)、需求响应等互动场景进行二次开发与应用验证。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧