English 中文(简体)
视觉C++: 将传统的C和C++号载体编码移至统法协会世界
原标题:Visual C++: Migrating traditional C and C++ string code to a Unicode world

我看到2008年视觉演播室,后来又开始用统法协会的《特征集》。 我的旧的C++代码只处理英文ASCII文本,全文如下:

  • Literal strings like "Hello World"
  • char type
  • char * pointers to allocated C strings
  • STL string type
  • 从<代码>STL string转至C string,反之亦然,用STL string Constructionor(接受const char *)和STL string.c_string.

    1. 我需要做些什么来改变这一守则,以便使其在演练的《统法》和《统法协会守则》的生态系统中发挥作用,使图书馆能够发挥作用? (我并不真正需要与ASCII和Unicode合作,这可以完全是统法协会。)

    2. 能否以独立的方式做到这一点? (即不使用微软类型)

我看到许多种类的广域名和密码以及散布在我的混淆之中的转换。 (<:w>, TCHAR,_T,_TEXT, TEXT等)

问题回答

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

我建议大量反对<代码>L”。 (后者不是多面格式)和微软关于如何使用统法协会的建议。

在这个问题上存在许多混乱。 有些人仍然认为Unicode = 2 byte natures ==UTF-16。 平等也不正确。

事实上,它有possible,甚至更适于停留在果园*和平原<代码>上:扼制,字面直和变化很少(并且仍然充分支持统法协会编码!)。

见我在这里的答复:https://stackoverflow.com/questions/1049947/should-utf-16-be- considered-harmful/1855375#。 如何最容易地(我认为)做到这一点。

我建议不要担心支持像牙和单典建筑(a-la TCHAR),并坚持统一编码。 这样,你们就能够更多地使用具有独立性的平台(wcscpy, wcsstr等),而不是依赖到<代码>TCHAR功能,这些功能是Micrpsoft特有的。

您可以使用以下几个字眼:而不是 st脚:铺设和替换所有<条码>s 和<条码>wchar_ts>。 随着像我这样大规模的变化,我发现你从一开始,让编辑指导你下一步工作。

我认为,在目前情况下可能无法明显看出的一件事是,在没有使用<<<<>sizeof的下层操作器的情况下,用小体进行扼杀。 因此,观看诸如<代码>char * p = (char*) Smalloc(11) - 10 natures + terminating NUL,这一插图将是其本应在wchar_t上的半数。 它应改为wchar_t * p = (wchar_t*)malloc(11*sizeof(wchar_t)

Oh和整个TCHAR将支持汇编时间ASCII/Unicode strings。 它这样界定了:

#ifdef _UNICODE
#define _T(x) L ## x
#else
#define _T(x) ## x
#endif

因此,在单编码配置中_T("blah”>成为L”blah,并在编目中加入blah>

“Hello World” -> L “Hello World”

char -> wchar_t(除非你实际上想要果园)

*-> wchar_t *

扼杀——和;扼杀

所有这些平台都是独立的。 然而,人们认识到,不同平台的特性可能有所不同(窗口两条 by,其他四条 by)。

将UNICODE和_UNICODE界定为贵项目(在视觉演播室,你可以通过确定项目在环境中使用Unicode)来做到这一点。 这使得_T、TCHAR、_TEXT和TEXT宏观自动成为L。 它们是Microsoft所特有的,因此,如果你想要做到交叉形,就可以避免。

你们的问题涉及两个不同但相互关联的概念。 其中之一是护卫(例如,Unicode/ASCII)。 另一种是用于特性陈述的数据类型。

从技术上讲,你可以使用平原<条码><>char/code>和斜体:显示。 您可在六dec(“x5FA”)或五氯("5FA)格式中使用字面字,以具体标明星体的顺序。 通知说,如果采用这种做法,你已经掌握了含有ASCII特征的字面,就应当仍然有效,因为统法协会的代码保留了ASCII的代码。

一个重要的观察点是,需要认真利用许多相关的职能。 这是因为他们是在bytes 而不是characters上运行的。 例如,std:string:operator[]可给你一个特别的星号,该星号仅是统法协会编码特性的一部分。

在视觉演播室密码中,选择“wchar_t为基本特性类型。 因此,如果你遵照他人在此提出的许多建议,你就应当更容易与微软图书馆合作。 采用“T”宏观(如果你想要维护统一编码/非统一编码之间的透明度),将<代码>char/code>替换为wchar_t

然而,我认为,实际上并没有一种在图书馆中与统法协会合作的标准,因为它们可能有不同的处理战略。





相关问题
Simple JAVA: Password Verifier problem

I have a simple problem that says: A password for xyz corporation is supposed to be 6 characters long and made up of a combination of letters and digits. Write a program fragment to read in a string ...

Case insensitive comparison of strings in shell script

The == operator is used to compare two strings in shell script. However, I want to compare two strings ignoring case, how can it be done? Is there any standard command for this?

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

String initialization with pair of iterators

I m trying to initialize string with iterators and something like this works: ifstream fin("tmp.txt"); istream_iterator<char> in_i(fin), eos; //here eos is 1 over the end string s(in_i, ...

break a string in parts

I have a string "pc1|pc2|pc3|" I want to get each word on different line like: pc1 pc2 pc3 I need to do this in C#... any suggestions??

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...