Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为UTF-8或UTF-16使用设计应用程序_C++_Algorithm_Unicode_Utf 8_Utf 16 - Fatal编程技术网

C++ 为UTF-8或UTF-16使用设计应用程序

C++ 为UTF-8或UTF-16使用设计应用程序,c++,algorithm,unicode,utf-8,utf-16,C++,Algorithm,Unicode,Utf 8,Utf 16,我正在开发一个主要由英语和西班牙语读者使用的应用程序。但是,将来我希望能够支持更多的扩展语言,比如日语。在考虑程序设计时,我遇到了UTF-8、UTF-16和多字节的问题。我想编译我的程序以支持UTF-8或UTF-16(当使用中文等语言时)。为了实现这一点,我想我应该有 #if _UTF8 typedef char char_type; #elif _UTF16 typedef unsigned short char_type; #else #error #endif 这样,将来当我使用UTF-

我正在开发一个主要由英语和西班牙语读者使用的应用程序。但是,将来我希望能够支持更多的扩展语言,比如日语。在考虑程序设计时,我遇到了UTF-8、UTF-16和多字节的问题。我想编译我的程序以支持UTF-8或UTF-16(当使用中文等语言时)。为了实现这一点,我想我应该有

#if _UTF8
typedef char char_type;
#elif _UTF16
typedef unsigned short char_type;
#else
#error
#endif
这样,将来当我使用UTF-16时,我可以切换#define(当然,对于
sprintf
等,也可以使用相同类型的#if/#endif)。我有自己的自定义字符串类型,因此也可以使用这种情况

使用上面提到的场景,用我的“char_类型”替换“char”的每次使用,会被认为是一个“坏主意”吗?如果是这样,为什么它被认为是一个坏主意,我如何才能实现我上面提到的


我想使用其中一个的原因是由于内存效率。如果我不使用UTF-16,我宁愿不要一直使用它。

UTF-8可以代表每个Unicode字符。如果您的应用程序正确地支持UTF-8,那么您对任何语言都是黄金


请注意,如果您正在编写Windows应用程序,Windows的本机控件中没有设置UTF-8文本的API。但是,很容易制作一个应用程序,它在内部使用UTF-8处理所有事情,在Windows中设置文本时转换UTF-8->UTF-16,在从Windows获取文本时转换UTF-16->UTF-8。我已经完成了,它的工作非常棒,比编写WCHAR应用程序要好得多。转换UTF-8 16非常简单;Windows为它提供了API,或者您可以在自己的代码中找到一个简单的(一页)函数来实现它。

我相信选择UTF-8就足以满足您的需要。请记住,上面的char_类型在两种编码中都小于一个字符


您可能希望看看这个讨论:了解不同类型的流行编码的好处。

这基本上就是Windows所做的(除了Windows API将
char
解释为“ANSI”代码页而不是UTF-8)


那么英语和西班牙语是“基本”语言,日语是“扩展”语言?比如,基本保健和牙齿美白?不用麻烦了。如果可以的话,使用
char32\t
将您的内部表示形式设置为UTF32,并提供干净的接口。要点是,您不应该认为任何一种语言比任何其他语言都更基本。只要从一开始就设计你的程序来处理每一个输入,你就会得到一个更干净的结果。(另外,永远不要在内部使用UTF16,因为这是一种无益的痛苦。它仍然是可变长度的,并且会增加其他问题。你不需要担心程序内存中的空间。)我希望更高效地使用内存,而不是总是使用尽可能大的值。我还没有遇到过这样的情况:wchar\u没有让我的生活更轻松。它一直造成混乱并增加复杂性。如果我总是使用UTF8,那么为什么会有UTF16,或者为什么在某些想法中会有选项,比如Visual Studio中的“Unicode或多字节”?@chadb,“多字节”的选项适用于仍然使用代码页的旧程序。因为Windows在内部使用UTF-16,所以从来没有理由使用它。就Windows而言,“Unicode”的意思是“UTF-16”,这是一个遗憾,因为UTF-8在大多数情况下都更好。不幸的是,在UTF8流行之前,微软已经完成了所有的Unicode工作。微软在Windows 2000中改用了UTF-16。在此之前,WindowsNT4使用的是UCS-2。Windows必须使用UTF-16来保持与现有代码的向后兼容,并且一直到今天都是如此。@chadb:read。从我到StilesCrisis的巨大+1!那么,如何在我的代码中有效地使用UTF8呢?我是否需要将“char_type”用作与“char”不同的typedef?如果是,应该是哪种类型?您只需要使用包含UTF8数据的常规字符字符串。不需要新类型。同意SC;请记住,char不是字符(它是较少的)。“char不是字符(它是较少的)”,我喜欢双关语。