【问题标题】:AnsiString in C++?C ++中的AnsiString?
【发布时间】:2015-01-08 23:34:48
【问题描述】:

C++ 中是否有像 Delphi 中那样的 AnsiString(65001) 类型?我想将它用于应用程序和 DLL 之间的互操作。

【问题讨论】:

  • 我猜这表示 Windows 代码页 65001 中的窄字符字符串,这是严重支持一半的 UTF-8 代码页。只需使用 std::string 并记住它是 UTF-8。
  • @Deduplicator 你确定吗? pastebin.com/siaV0ytN
  • @Deduplicator: “只要使用std::string,记住它是UTF-8” ← 你说std::string 是UTF-8。它不是 UTF-8。它也不是 not UTF-8,但也不是 UTF-8。
  • 您应该使用std::string 来处理8 位字符串,并且您可以通过两者的c_ptr() 转换为AnsiString 或从AnsiString 转换。关键是AnsiString<> 知道它的内容是什么代码页,而std::string 不知道;您也应该存储该信息。包含代码页、std::string 和转换方法的复合类型将是一个好方法。
  • 多少“喜欢”AnsiString 你需要这个假设的 C++ 类型吗?这种类型有很多方面。你提到互操作——这是否意味着应用程序在 Delphi 中,并且你想用 C++ 编写一个接收和返回 AnsiString 值的 DLL?这是一个愚蠢的差事。或者你的意思是你想要一个仅 C++ 的类型,当分配给协作类型时,它会在代码页之间自动转换?你可以为此做点什么。或者你只是说你想要一个可以保存 UTF-8 字符的字符串类型?请edit您的问题更准确地说明您真正需要什么。

标签: c++ delphi visual-c++


【解决方案1】:

std::string 保证充当chars 的容器,char 保证正好是 1 个字节,这似乎与 AnsiString 的描述相匹配。

虽然请注意,如果您真的愿意,您始终可以在 std::string 中强制使用一些多字节 Unicode 字符,但没有编译器强制保证每个逻辑字符都由 1 个字节编码。在 C++ 中没有简单的方法来强制执行这一点,除非编写自己的类。

为了互操作性,您可能希望使用原始 cstring (char*)。

【讨论】:

    【解决方案2】:

    在 C++Builder 中(它使用与 Delphi 相同的 RTL),有一个 AnsiStringT 模板类,它提供与 Delphi 的 AnsiString(N) 类型相同的功能:

    template <unsigned short CP>
    class RTL_DELPHIRETURN AnsiStringT : public AnsiStringBase
    

    CP 是所需的代码页。

    RTL 的 UTF8StringRawByteString 类型只是此功能的别名:

    德尔福:

    type
      UTF8String = type AnsiString(65001);
      RawByteString = type AnsiString($ffff);
    

    C++Builder:

    typedef AnsiStringT<65001> UTF8String;
    typedef AnsiStringT<65535> RawByteString;
    

    【讨论】:

    • 在其他 C++ 编译器中没有这样的等效功能。您必须通过 MultiByteToWideChar()/WideCharToMultiByte()std::codecvt 等在代码中使用显式转换(如果需要,您可以使用它们编写自己的 AnsiStringT 类包装器类)。
    • 我必须将AnsiString 移植到Visual C++ 然后:)
    • @John 这个答案似乎没有解决你关于 MSVC 的问题。我不知道你为什么接受这个答案。移植 Embartl 可能不是可行的方法。
    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    相关资源
    最近更新 更多