Windows CE, Unicode and Visual Studio 2008

Windows CE, Unicode and Visual Studio 2008

本文关键字:Visual Studio 2008 and Unicode CE Windows      更新时间:2023-10-16

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

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

我尝试过 UTF16、UTF16-LE

和 UTF16-BE 文件,但似乎没有一个能够显示。

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

注意:我已经在打开Unicode字符集的情况下进行了编译。

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

任何帮助\指导,以使Unicode文本显示在消息框中。请注意,Windows CE的C++SDK非常精简,有很多新功能不可用,而且我必须在Visual Studio 2008中编译它。

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

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"宽字符字符串"。

在 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;
}