在Windows

时间:2015-10-01 08:39:26

标签: c++ unicode hebrew

我有问题将希伯来字符串放在这样的变量中:

wchar_t* hebrewString = L"א";

א的unicode值以十六进制为0x05d0或十进制为1488。

问题在于我的记忆显示出完全不相关的不同价值 到א的实际值。

如果我写:

wchar_t hebrewChar = 0x05d0 

很明显,正确的值将在hebrewChar,但我想写常规字符串。

我想也许我做错了所以我查看了生成 ASM 代码,即使它出现了错误的值。

我怎样才能以简单的方式写希伯来字符串?

编辑1:

添加源代码(在代码上面的注释中是程序集)

wchar_t d = 0x05D0;
// DB 0f3H, 05H, 090H, 00H, 00H, 00H
wchar_t *test = L"א";
// mov  eax, 1523               ; 000005f3H
wchar_t test1 = L'א';
// mov  eax, -112               ; ffffff90H
char test2 = 'א';

1 个答案:

答案 0 :(得分:1)

通过在字符串或Unicode字符前指定 L ,编译器会将其转换为与保存的编码文件匹配的编码。因此,您必须通过 FILE - >更改文件编码提前保存选项选择带签名的UTF 8 - 代码页65001

另请注意,Windows控制台无法打印所有Unicode字符(如果您使用不同的默认语言和编码,则可以使用。)

这里还有一个示例,通过将字符保存到文本文件中来查看代码是否正常工作:

#include <iostream>
#include <fstream>

using namespace std;


int main()
{
    // UCS-2 little endian text file magic number
    char magic_number[] = { 0xFF, 0xFE };    
    wchar_t unicode_char = L'א';
    wchar_t unicode_val = 0x05d0;

    if (unicode_char == unicode_val)
        cout << "Works!" << endl;

    ofstream f("out.txt", ios::out);

    f.write(magic_number, 2);
    f.write((char *)&unicode_char, 2);
    f.close();

    return 0;
}

打开文件并检查值是否正确打印。 否则,为了在代码中存储非ANSI字符,我强烈建议使用像ICU这样的库来保存,加载...... - 通常所有关于字符串的操作。