【问题标题】:convert unicode to char将 unicode 转换为 char
【发布时间】:2012-06-17 22:26:33
【问题描述】:

如何在 embarcadero c++ 中将 Unicode 字符串转换为 char*char* const

【问题讨论】:

标签: c++ unicode char locale c++builder


【解决方案1】:

您可以合法地将任何数组重新解释为 char 指针数组。因此,如果您的 Unicode 数据采用 4 字节代码单元,例如

char32_t data[100];

然后您可以将其作为 char 数组访问:

char const * p = reinterpret_cast<char const*>(data);

for (std::size_t i = 0; i != sizeof data; ++i)
{
    std::printf("Byte %03zu is 0x%02X.\n", i, p[i]);
}

这样,您可以逐个检查 Unicode 数据的各个字节。

(这当然与 转换文本的编码 无关。为此,请使用 iconv 或 ICU 之类的库。)

【讨论】:

  • 正弦 OP 特别要求转换,这似乎不是一个非常有用的答案。
【解决方案2】:

“Unicode 字符串”确实不够具体,无法知道您的源数据是什么,但您的意思可能是“存储为 wchar_t 数组的 UTF-16 字符串”,因为大多数不知道正确术语的人都在使用。

"char*" 也不足以知道你想要定位什么,尽管也许 "embarcadero" 有一些约定。除非您另有说明,否则我将假设您需要 UTF-8 数据。

另外,我将把我的例子限制在 VS2010 中的工作

// your "Unicode" string
wchar_t const * utf16_string = L"Hello, World!";

// #include <codecvt>
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t> convert;

std::string utf8_string = convert.to_bytes(utf16_string);

这假设 wchar_t 字符串是 UTF-16,就像在 Windows 上的情况一样,否则是可移植代码。

【讨论】:

  • Embarcadero 确实有你所说的“一些约定”。来自文档的引用:'Delphi 也支持 UnicodeString,但将其实现为原始类型而不是类。默认情况下,声明为 String 类型的变量是 UnicodeString。' 另外需要注意的是:'尽管它的名字,UnicodeString 可以表示 Unicode 字符串和 ANSI 字符串,ANSI 字符串首先被转换。'
  • 'ANSI string' 仍然是不够的,即使我们忽略了美国国家标准协会从未定义过这样一个事实并认识到他们指的是微软所指的那个名称; Microsoft 定义了许多可以与所谓的“ANSI”字符串一起使用的“代码页”。
【解决方案3】:
String text = "Hello world";
char *txt = AnsiString(text).c_str();

Older text.t_str() is now AnsiString(String).c_str()

【讨论】:

  • 这是正确的答案,直接来自 Embarcadero 文档。
  • 这将无法处理正在使用的语言环境之外的任何字符,并且由于 Windows 上没有支持所有字符的语言环境(例如,UTF-8 语言环境将支持所有字符)AnsiString无法为 Windows 上的所有输入提供无损转换。
  • 请注意,您可以为 AnsiString 指定代码页:docwiki.embarcadero.com/RADStudio/Seattle/en/… 但是,您是对的,从 Unicode 转换为 ANSI 可能(并且通常会)有损。
【解决方案4】:

如果您使用 Windows:

//#include <windows.h>
u16string utext = u"объява";
char text[0x100];
WideCharToMultiByte(CP_UTF8,NULL,(const wchar_t*)(utext.c_str()),-1,text,-1,NULL,NULL);
cout << text;

我们不能使用 std::wstring_convert,因此在 MinGW 4.9.2 中不可用。

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多