Note: Wow... Ap 显然,SOMEONE决定,ALMOST所有答复都值得压缩,即便是正确的。 我走了车,以平衡倒塌的......。
请允许我看一下我是否走了......:
Edit : REJOICE!!!
9小时前,someone 也许,在Pavel Radzivilovsky诉人之后,他们推翻了这一答案。 当然,没有任何评论表明我的回答是错误的。
页: 1
1 - How to migrate on Windows Unicode?
我需要做些什么来改变这一守则,以便使其在演练的《统法》和《统法协会守则》的生态系统中发挥作用,使图书馆能够发挥作用? (我并不真正需要与ASCII和Unicode合作,这可以完全是统法协会。)
1.a - My codebase is large, I can t do it in one step!
请允许我想象一下,我们会逐步这样做(因为你的用意并非很小)。
我的团队也存在同样的问题: 我想要制定统法协会的现成法典,与并非统法协会已准备好的法典共存。
为此,你必须使用管理系统头盔<代码>tchar.h,并使用其设施。 利用你自己的实例:
"Hello World"
----> _T("Hello World")
char
type ----> TCHAR
type
char *
pointers to allocated C strings ----> TCHAR *
pointers
std::string
type ---> This is tricky because you must create your own std::tstring
- remember that sizeof(char) can be different from sizeof(TCHAR), so update your mallocs and new[], too
1.b - Your own tstring.hpp
header
为了与我的汇编者一道处理STL(当时,我正在视像C++2003年工作,因此你的里程可能有所不同),我必须提供<密码>,显示.hpp的头盔,该台既是跨平台,又使用户能够使用指示、警示等。 我可以在此提出完整的消息来源,但我将作一 extract,使你能够自己生产:
namespace std
{
#ifdef _MSC_VER
#ifdef UNICODE
typedef wstring tstring ;
typedef wistream tistream ;
// etc.
#else // Not UNICODE
typedef string tstring ;
typedef istream tistream ;
// etc.
#endif
#endif
} // namespace std
通常,它无权对<代码>std 名称空间进行污染,但我猜测这为Ok(经测试为O)。
这样,你就可以预先确定大多数STL/C++ iostreams的构造为t
,并使统法协会编码(视窗)就绪。
1.c - It s done!!!
现在,你可以通过界定<代码”从ANSI模式转向UNICODE模式。 UNICODE和_UNICODE
通常在项目环境中界定(我记得2008年在视觉C++上,第一环境网页上有一栏的条目。)
我的建议是,因为你可能有一个关于你的视觉C++项目的“建议”和“释放”模式,以形成一种由它们产生的“建议统法协会编码”和“请统法协会编码”模式,在这些模式中界定了上述宏观。
因此,你能够生产ANSI和UNICODE binaries。
1.d - Now, everything is (or should be) Unicode!
如果你希望你的建议是相互交错的,则无视这一节。
现在,你要么可以一行修改你的所有代码基,要么已经改装了你的所有代码基,以使用上面描述的<代码>tchar.h特征。
_T("Hello World")
----> L"Hello World"
TCHAR
type ----> wchar_t
type
TCHAR *
pointers to allocated C strings ----> wchar_t *
pointers
std::tstring
type ---> std::wstring
type, etc.
1.e - Remember UTF-16 glyphs can be 1 or 2 wchar_t wide on Windows!
视窗上的一种常见错误观念是相信 w特性是统法协会的一种缩略语。 这种做法是错误的,因为一些统法协会编码的缩略语有两种含义。
因此,如果你使用统法协会编码的缩略语,则任何依靠一个<条码>的代谢/代码(条码>)的编码都有可能中断。
2 - Doing it cross platform?
能否以独立的方式做到这一点? (即不使用微软类型)
现在,这是trick的。
如今,统法协会已经准备好了“条码”(<>条码><>/代码>的类型,应当包含UTF-8值。
这意味着,如我在乌本图10.04上汇编的,你的话,是用不实的统法协会编码编写的。
2.a - Remember UTF-8 glyphs can be 1, 2, 3 or 4 char wide on Linux!
当然,上述关于UTF-16和大char的建议在这方面更为重要:
需有代表的统法协会代码glyph。 因此,根据以下假设,你使用的任何代码:每条<代码>>,编码>是统法协会的随附编码。
2.b - There is no tchar.h
on Linux!
我的解决办法: 撰写。
如本摘要所示,你只需要界定预设标志,以图示正常标志:
#ifdef __GNUC__
#ifdef __cplusplus
extern "C" {
#endif
#define _TEOF EOF
#define __T(x) x
// etc.
#define _tmain main
// etc.
#define _tprintf printf
#define _ftprintf fprintf
// etc.
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
#ifdef __cplusplus
}
#endif
#endif // __GNUC__
. . . .
2.c - There is no tstring
on Linux!
当然,上文为Windows所做的STL绘图工作应当完成,以便处理Loplin案件:
namespace std
{
#ifdef _MSC_VER
#ifdef UNICODE
typedef wstring tstring ;
typedef wistream tistream ;
// etc.
#else // Not UNICODE
typedef string tstring ;
typedef istream tistream ;
// etc.
#endif
#elif defined(__GNUC__)
typedef string tstring ;
typedef istream tistream ;
// etc.
#endif
} // namespace std
现在,您可以使用<代码>_T(“Hello World”)和std:tstring
on CESCR as well asWindows。
3 - There must be a catch!
还有。
首先,存在着对<代码>std名称空间的污染问题,其名称为:t
预先设定的符号,应当加以禁止。 然后,不要忘记在宏观上增加的内容,这将污染你的法典。 在本案中,我猜测这是奥基。
有两个,我假定你正在视窗上使用MSVC(代号:宏观<代码>_MSC_VER/code>)和海合会关于短链氯化石蜡(代号:宏观代码<_GNUC_)。 修改贵国案件是否不同的定义。
第三,你的法典必须是统法协会的中性,也就是说,你不能依赖你的指示,成为UTF-8或UTF-16。 事实上,除了ASCII chars外,你的消息来源应当空洞,以保持相互兼容。
这意味着,某些特征,如寻找“无统法协会”编码Glyph的存在,必须以单独的法典进行,该法典将包含所有必要的<代码>#define,使之正确。
例如,在使用UTF-16(Wchar_t onWindows)和UTF-8(char<>/code>的两种特性(195和169)时,需要查询第233号特征。 这意味着,你要么必须使用统法协会的一些图书馆来这样做,要么书写。
但是,这比统法协会视窗或赖恩的编码更是一个统法协会的问题。
3.a - But Windows is supposed to not handle UTF-16 correctly
因此,情况如何?
我所描述的“静态”实例是EDIT Win32控制,该控制本应无法正确支持视窗上的非BMP UTF-16焦炭(我没有核实ug,我只是没有足够注意)。
这是一个微软问题。 你在法典中的任何决定都不会改变这种丑恶存在的事实,也不会改变温32·安普森。 因此,在Windows上使用UTF-8 果园,纠正了EDIT控制中的ug。 你们唯一能够做的是建立自己的EDIT控制(代号控制,正确处理BAKSPACE活动)或你自己的转换功能。
Don t 混淆了两个不同的问题,即: 即视窗APIC/i>和 本身代码中的“bug”。 您自己的代码中的任何规定都不会避免视窗软件中的泡沫,除非您使用所谓的硬窗软件。
3.b - But UTF-16 on Windows, UTF-8 on Linux, isn t that complicated?
是的,如果你在性质上假设太多的话,它可能会导致在另一些平台上出现ug。
我假定你的主平台是Windows(或你希望为<代码>wchar_t和<代码>用户提供图书馆)。
但是,如果情况并非如此,如果Windows不是你的主要平台,那么就找到了选择你所有的char子和 st子的办法:扼杀将含有UTF-8的特性,除非有不同的意思。 因此,你需要总结转录器,以确保你的charUTF-8号护法不会被视窗上的ANSI(或其他代号)char误。 例如,<代码>stdio.h和iostream
的图书馆的名称,以及Win32 API(例如CreateWindowA)的ANSI版本。
这是使用UTF-8特性的GTK+方法,但令人惊讶的是,使用UTF-16的QT(建造的HCFC KE)。
资料来源:
尽管如此,它还是从“Hey”获得保护,但Win32 edit控制不处理我的单编码问题,因此,你不得不下级控制,以掌握所期望的行为(如果这种控制仍然存在)。
Appendix
见我在上的答复:wstring VS :string www.un.org/spanish/ga/president