【问题标题】:tchar safe functions -- count parameter for UTF-8 constantstchar 安全函数 -- UTF-8 常量的计数参数
【发布时间】:2011-02-28 22:08:16
【问题描述】:

我正在将一个库从 char 移植到 TCHAR。根据 MSDN,此片段的 count 参数是多字节字符数,而不是字节数。那么,我做对了吗?我在 VC9 中的项目属性说“使用 unicode 字符集”,我认为这是正确的,但我不会影响我的计数参数。

_tcsncmp(access, TEXT("ftp"), 3); //or do i want _tcsnccmp?

“仅在 Windows 平台上支持,_mbsncmp 和 _mbsnbcmp 是 strncmp 的多字节版本。_mbsncmp 将比较最多 count 个多字节字符,_mbsnbcmp 将最多比较 count 个字节。它们都使用当前的多字节代码页。

_tcsnccmp 和 _tcsncmp 分别是 _mbsncmp 和 _mbsnbcmp 对应的泛型函数。 _tccmp 等价于 _tcsnccmp。”

一个类似的问题是_tcslen vs _tcsclen。

【问题讨论】:

    标签: c++ windows unicode tchar mbcs


    【解决方案1】:

    是的,你没看错。

    然而,问题是为什么要将它移植到 TCHAR - 这对 _UNICODE 定义很敏感。

    为什么不使用 UTF8 和 char*?

    【讨论】:

    • 这不是重点吗?我移植到 tchar 只是因为周围的代码正在使用它。我在这里有选择吗?
    • 有一种严肃的观点认为 TCHAR 是一种错误的努力,应该放弃。见stackoverflow.com/questions/1049947/…
    • 我移植了一个 1995 年编写的解析方法,用于对 basic_string 进行操作。我开始认为这可能是解析逻辑对多字节字符敏感。我不认为将 UTF-8 字节数组传递给这个函数会很漂亮。
    • 如果你有一个在 char* 上运行的方法,让它兼容 UTF-8 比 TCHAR 兼容容易得多。而且效果更好。
    【解决方案2】:

    TCHAR 是 8 位或 16 位的类型,具体取决于是否定义了 _UNICODE。但是 UTF-8 总是 使用 8 位代码单元,所以使用 TCHAR 是愚蠢的。只需使用char

    TCHAR 与存在两个版本的 Windows API 相关:使用旧版 8 位代码页的“A”函数和使用 UTF-16 的“W”函数。 UTF-8 is not supported。您可以通过将 UTF-8 字符串显式转换为 UTF-16 以进行 API 调用,在 Windows 上使用 UTF-8,但您不会从 _UNICODETCHAR 获得任何帮助。

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多