【问题标题】:wcstombs doesn't work properlywcstombs 无法正常工作
【发布时间】:2017-08-07 04:17:48
【问题描述】:

我有一个 utf-8 文件,我可以使用 Widechar 函数正常处理它。

但是现在我需要以多字节形式转换和使用它们,我正在努力让它工作。

printf("%s\n",setlocale(LC_CTYPE, "")); //English_United States.1252
_setmbcp(_MB_CP_LOCALE);
FILE *f = NULL;
f = _wfopen(L"data.txt", L"r,ccs=UTF-8");
wchar_t x[256];
fwscanf(f, L"%ls", x); //x = L"một"
char mb[256];
int l = wcstombs(mb, x, 256); //mb = "m?t"

我做错了什么?

【问题讨论】:

    标签: c visual-studio unicode


    【解决方案1】:

    在您的文本文件中,您有字符 (注意字符下方的点)而不是 ô

    ô 字符存在于codepage 1252 中,但字符 不存在,因此wcstombs 将其转换为?

    如果您的 UTF-8 编码文本文件包含西里尔字符或希腊字符,您将遇到同样的问题。

    唯一的解决方案是没有在代码页 1252 中没有表示的字符。

    【讨论】:

    • 或者使用 UTF-8 语言环境?
    • @FelixPalmen 这听起来很有趣,你能详细说明一下吗?
    • AFAIK wcstombs 使用当前语言环境作为其输出(mbs = 多字节字符串 表明这可以是像 UTF-8 这样的多字节编码)我没有t 验证这一点。在 OPs 示例中这当然是愚蠢的,因为他正在使用转换为 wchar_t 来读取 UTF-8 文件,所以 wcstombs 只会使用 UTF-8 语言环境将其转换回原始状态。
    • 下一个问题是windows是否支持这个。它绝对确实支持 UTF-8 输出,具有类似的 winapi 函数WideCharToMultiByte()
    • @FelixPalmen 在我的电脑中,UTF-8 语言环境似乎不存在,因为 setlocale 返回 null。
    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 2016-09-01
    • 2012-07-11
    • 2018-04-08
    • 2017-04-20
    • 2018-10-02
    • 2016-09-04
    • 2010-10-06
    相关资源
    最近更新 更多