【问题标题】:Microsoft C++ implementation of std::mbstate_tstd::mbstate_t 的 Microsoft C++ 实现
【发布时间】:2020-04-08 07:11:30
【问题描述】:

我有一些适用于 UTF8/16 转换和 wstream-s 的旧代码。它是在 VS08-VS10 上编写的,它假设 mbstate_t 的类型是 int。它使用它来检查一些状态,例如

while(_State & 0x80000000 && ...)

unsigned n = _State & 0x7FFFFFFF; 
if(n<=0x3F)...

但现在我需要用现代 Visual Studio 编译它,并且 mbstate 以结构形式呈现:

typedef struct _Mbstatet
{ // state of a multibyte translation
    unsigned long _Wchar;
    unsigned short _Byte, _State;
} _Mbstatet;

我猜想在上面提供的所有操作中都需要使用_State 字段。但它只是 16 位,而在我的传统中它与 32 位常量一起使用。我试图找到一些关于它的文档,但我还没有成功。有人经历过吗?

【问题讨论】:

  • 这是未记录的原因 - 您根本不应该编写依赖于实现的代码。代码需要重写。 (此外,以下划线和大写字母开头的标识符保留用于实现。)
  • 如果您引用了更多代码,那么有人可能能够对代码尝试执行的操作进行有根据的猜测,甚至显示编写代码的正确方法。
  • 好吧,我认为它是一个用于将 UTF-8 字节读/写到 UTF-16 流中的 Facet。所以我想我可以用一些 Boost 实现替换所有代码

标签: c++ visual-c++


【解决方案1】:

最后,我发现对内部实现进行假设是个坏主意。 所以,我用 #if _MSC_VER &gt;= 1925
对于我的代码 + 此处的答案:Reading UTF-8 text and converting to UTF-16 using standard C++ wifstream

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多