如何在UTF-8和TCHAR之间进行通用转换

如何在UTF-8和TCHAR之间进行通用转换,c,winapi,utf-8,tchar,C,Winapi,Utf 8,Tchar,我知道我在网上看到过,但当我搜索它时,我只找到了一个例子。然而,只有定义了UNICODE时,该代码才有效,我认为我看到的代码在UNICODE未定义时有条件(我认为还有第三种情况-是否定义了MBCS) 问题是: 我能找到我以为在什么地方看到的消息来源吗 这三种情况是唯一需要处理的,我说的对吗?在非UNICODE的情况下,转换是如何完成的 转换的目的是与windows API一起使用 没有,只有两种情况。直接的(UTF-8到UTF-16)和不可能的(UTF-8到MBCS)。MBCS不能表示UTF-8

我知道我在网上看到过,但当我搜索它时,我只找到了一个例子。然而,只有定义了
UNICODE
时,该代码才有效,我认为我看到的代码在
UNICODE
未定义时有条件(我认为还有第三种情况-是否定义了
MBCS

问题是:

  • 我能找到我以为在什么地方看到的消息来源吗
  • 这三种情况是唯一需要处理的,我说的对吗?在非UNICODE的情况下,转换是如何完成的

  • 转换的目的是与windows API一起使用

    没有,只有两种情况。直接的(UTF-8到UTF-16)和不可能的(UTF-8到MBCS)。MBCS不能表示UTF-8可以编码的所有代码点。注意:除了与Win9x版本的Windows兼容外,Windows API不使用
    TCHAR
    S。如果您的目标是任何受支持的Windows版本(或任何不受支持的基于Windows NT的版本),您只需传递
    wchar\u t*
    ,而不是
    TCHAR*
    (除了极少数例外,这需要
    char*
    )。P.P.S.:在Windows上处理UTF-8的正确方法是在数据进入应用程序时转换为UTF-16(套接字、文件、管道等),并在离开应用程序时转换为UTF-8。在应用程序内部应该只有UTF-16编码的字符串数据。少数例外是内部Windows API,它只处理ANSI字符串(如)另一种观点是,当访问Windows API函数时,将所有东西保持为UTF-8,并转换为UTF-16。参见和.C++,这是所有问题;C.@ IcTestTable中的问题更难解决:这是一个坏建议,它既不包含编写便携代码,也不包含数据流的干净的往返处理,这些数据文件可能包含非UTF-8垃圾。(这是垃圾,但不应该被你的程序破坏)。@IanAbbott:这个问题在普通C中很容易解决(或者很快就会解决)。不,只有两种情况。一种是直接的(UTF-8到UTF-16),另一种是不可能的(UTF-8到MBCS).MBCS不能表示UTF-8可以编码的所有代码点。P.S.:Windows API不使用
    TCHAR
    S,除非与Win9x版本的Windows兼容。如果您的目标是任何受支持的Windows版本(或任何不受支持的基于Windows NT的版本),您只需通过
    wchar\u t*
    来代替
    TCHAR*
    (除极少数例外情况外,需要
    char*
    )。P.P.S.:在Windows上处理UTF-8的正确方法是在数据进入应用程序(套接字、文件、管道等)时转换为UTF-16,并在离开应用程序时转换为UTF-8。在应用程序内部应该只有UTF-16编码的字符串数据。少数例外是内部Windows API,它只处理ANSI字符串(如)另一种观点是,当访问Windows API函数时,将所有东西保持为UTF-8,并转换为UTF-16。参见和.C++,这是所有问题;C.@ IcTestTable中的问题更难解决:这是一个坏建议,它既不包含编写便携代码,也不包含数据流的干净的往返处理,这些数据文件可能包含非UTF-8垃圾。(这是垃圾,但不应该被你的程序破坏)。@IanAbbott:这个问题在普通C语言中很容易(或者很快就会)用它解决。