我只是想学习来自C ++的D。我敢肯定这是非常基本的东西,但是找不到任何文档可以帮助我。我正在尝试打印字符à,它是U + 00E0。我正在尝试将此字符分配给变量,然后使用write()
将其输出到控制台。
我被告知by this website,U + 00E0在UTF-8中编码为0xC3 0xA0
,在UTF-16中编码为0x00E0
,在UTF-32中编码为0x000000E0
。 / p>
请注意,对于我尝试过的所有操作,我都尝试将string
替换为char[]
,将wstring
替换为wchar[]
。我也尝试过在宽字符串后使用w
或d
后缀。
这些方法返回编译器错误“无效的尾随代码单元”:
string str = "à";
wstring str = "à"w;
dstring str = "à"d;
这些方法打印完全不同的字符(Ò U + 00D2):
string str = "\xE0";
string str = hexString!"E0";
所有这些方法都会打印出˧á的样子(注意á≠à!),即UTF-16 0x2E7 0x00E1:
string str = "\xC3\xA0";
wstring str = "\u00E0"w;
dstring str = "\U000000E0"d;
有什么想法吗?
答案 0 :(得分:1)
我确认它可以在我的Windows机器上使用,所以现在要输入答案作为答案。
在源代码中,如果直接复制/粘贴字符,请确保编辑器将其保存为utf8编码。 D编译器坚持使用它,因此,如果它给出有关utf的编译错误,则可能是原因。我从没用过c:b,但是网上的一个老答案说是edit-> encodings ...无论如何,它都是编辑器中的一个设置。
或者,您可以将源代码中的字符替换为字符串中的\uxxxx
。请勿使用十六进制字符串(即二进制字节),但是您的"\u00E0"
示例很好,并且适用于任何类型的字符串(不仅像示例中的wstring)。
然后,在输出端,它取决于您的目标,因为该程序仅输出字节,并且由接收程序正确地解释它。既然您说过您在Windows上,那么关键是将控制台代码页设置为utf-8,以便它知道您要执行的操作。实际上,也可以从D调用相同的C函数。导致该程序:
import core.sys.windows.windows;
import std.stdio;
void main() {
SetConsoleOutputCP(65001);
writeln("Hi \u00E0");
}
成功打印。在较旧的Windows版本上,您可能还需要更改字体以查看字符(与之相对的是显示通用框,因为某些字体没有所有字符),但是在Windows 10框中,它只能与默认字体。
顺便说一句,从技术上讲,控制台代码页是一个共享设置(运行该程序并退出后,您仍然可以在控制台窗口中单击属性,并看到那里反映出的更改),并且也许应该在程序退出时将其重新设置。您可以在启动时使用get函数(https://docs.microsoft.com/en-us/windows/console/getconsoleoutputcp)将其获取,将其存储在本地var中,然后在退出时将其重新设置。您可以在启动时auto ccp = GetConsoleOutputCP(); SetConsoleOutputCP(65005;) scope(exit) SetConsoleOutputCP(ccp);
进行操作-作用域退出将在函数退出时运行,因此在main中这样做会很方便。只需添加一些错误检查即可。
Microsoft文档没有说什么将其重新设置,因此它实际上并不重要,但我还是想提一下以防万一。但是,共享和持久存在的知识也可以帮助调试-如果在注释后它可以工作,那不是因为不需要代码,只是因为它是先前设置的,尚未设置! >
请注意,从IDE运行它可能并不完全相同,因为IDE经常通过管道传输输出,而不是直接将输出运行到Windows控制台。如果发生这种情况,lemme就会知道,我们也可以为以后的读者提供一些相关知识。但是,您也可以打开自己的控制台副本(在IDE外部运行该程序),它应该为您正确显示。
答案 1 :(得分:0)
D源代码需要被编码为UTF-8。 我的猜测是您要将UTF-16字符放入UTF-8源文件中。
例如
import std.stdio;
void main() {
writeln(cast(char)0xC3, cast(char)0xA0);
}
将所查找的字符输出为UTF-8。
然后您可以像这样硬编码:
import std.stdio;
void main() {
string str = "à";
writeln(str);
}