Windows CE、Unicode 和 Visual Studio 2008

Windows CE, Unicode and Visual Studio 2008

我正在尝试编写我们现有 Windows CE 产品系列的多语言版本。我有一个 UTF8(无 BOM)编码的文件,我正在尝试读取它并将其显示在 MessageBox 中。

如果我在 CPP 文件中放置 Unicode 字符并以这种方式显示它,我很幸运,但有些字符不显示。

我试过UTF16、UTF16-LE和UTF16-BE文件,none好像可以显示。

我已经尝试过 ifstream 和 wfstream 以及 CFile - 我还尝试过我在谷歌搜索时发现的 CStudioFile。我可以将文本保存回另一个文件并将其视为 Unicode - 我只是在我的 Windows CE 应用程序中看不到它。

注意:我编译时开启了Unicode字符集开关。

我还没有弄清楚正在读取文件的编码方式 - 但正如我所说,我可以将其保存回去并以 Unicode 格式读取它,但不会显示在对话框中。

任何 help\guidance 感谢在 MessageBox 中显示 Unicode 文本。请注意 Windows CE 的 C++ SDK 非常精简,有很多新功能不可用,而且我必须在 Visual Studio 2008 年编译它。

编辑下面答案中的代码片段。 MessageBoxW 不显示正确的文本。可能只是模拟器的字体问题。

CFile file(L"c:\test\_utf8.txt", CFile::modeRead);
int filesize = file.GetLength();
CStringA strA;
file.Read(strA.GetBuffer(filesize), filesize);
strA.ReleaseBuffer();
CStringW strW = CA2W(strA, CP_UTF8);
strW.AppendChar(0);
MessageBoxW(0, strW, 0, 0);

Windows 使用 UTF16-LE。使用 MultiByteToWideChar(CP_UTF8, ...)UTF8 转换为 UTF16-LE,然后使用 Windows API 函数显示 UTF16-LE "wide char string"。

在 MFC 中你可以使用

CFile file(L"c:\test\_utf8.txt", CFile::modeRead);
int filesize = file.GetLength();
CStringA strA;
file.Read(strA.GetBuffer(filesize), filesize);
strA.ReleaseBuffer();
CStringW strW = CA2W(strA, CP_UTF8);
strW.AppendChar(0);
MessageBoxW(0, strW, 0, 0);

我不确定 WinCE 中有什么可用。要使用 C++ 标准库,请使用 std::fstream 打开,读取 std::string 并将其转换为 std::wstring

另一个简单的例子API:

wchar_t* readfile(const wchar_t* filename)
{
    HANDLE handle = CreateFileW(filename, GENERIC_READ, 0, 
            NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (handle == INVALID_HANDLE_VALUE) return NULL;

    wchar_t *wbuf = NULL;
    int len = GetFileSize(handle, 0);
    if (len)
    {
        char *buf = new char[len];
        DWORD temp;
        ReadFile(handle, buf, len, &temp, 0);

        int wlen =
        MultiByteToWideChar(CP_UTF8, 0, buf, len, 0, 0);
        wbuf = new wchar_t[wlen + 1];
        MultiByteToWideChar(CP_UTF8, 0, buf, len, wbuf, wlen);
        wbuf[wlen] = 0;
        delete[]buf;
    }
    CloseHandle(handle);
    return wbuf;
}

...
wchar_t *wbuf = readfile(L"c:\test\utf8.txt");
if (wbuf) 
{
    MessageBoxW(0, wbuf, 0, 0);
    delete[]wbuf;
}