我在C#中创建一个图像,其中应包含一些日文文本。然后我将这个图像放入整个页面,也是日文。整个页面显示正确(编码:UTF-8),但图像渲染不正确。而不是正确的文本我得到错误的符号(不是'?',但类似于方形)。
我需要在Arial中的图像上写这个文本。有谁知道什么可能是错的?为什么文本无法正确呈现。 还有一个想法...当我在我的本地机器上测试时,一切看起来都正确,但是当我在外部服务器上部署带有页面的app时,会发生这种奇怪的错误。
为了使用文本创建图像,我使用:
Font f = Font("Arial", 10f, FontStyle.Bold);
g.DrawString(text, f, b, rect);
答案 0 :(得分:4)
外部服务器可能安装了Arial版本,但不包括日文字符集(据我所知,包含日文的版本称为“Arial Unicode MS”)。请记住,当您在ASP.NET中生成图像时,它是使用的服务器字体。
但请注意,从法律上讲,您不能安装“Arial Unicode MS”,除非它是Office的一部分 - 或者您已经从Monotype/Ascender获得许可(“Arial Unicode”)。根据你的资金,用一些其他字体替换Arial可能是一个更可行的选择(我将保留我对Arial的主观意见)。
在服务器上安装新字体时,请确保重新启动IIS。在重新启动之前.NET不会识别安装的字体(重新启动应用程序是不够的 - 可能足以回收应用程序池,但我从未尝试过)。
<强>更新强>
如果它仍然不起作用,则可能没有字体回退。即,你正在指定“Arial”,但是GDI +(DrawString
)不知道回归到“Arial Unicode MS”的不是Arial中的字符(Office认为安装时,我认为)。
两种可能性:
更改您的代码以实际使用字体(即“Arial Unicode MS”)而不是“Arial”(在任何其他版本中从不使用日文字符)。这样做的缺点是,如果你使用的是其他字符而不是日语,它们看起来(甚至)不如标准的“Arial”字体好,因为“Arial Unicode MS”不包括字距或其他类似的功能。
或者检查Arial和(本地)注册表中的其他字体之间是否存在链接:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink
- 其中一种字体将实际显示日语字符作为后备字体 - 它可能甚至不是“Arial Unicode”。您可以在服务器上的注册表中手动添加相同的链接(并可能再次重新启动IIS)。
另一个可能用于后备的候选人是“MS Gothic”。据我所知,GDI +使用上述“FontLink”系统进行字体回退,而WPF使用自己的系统。最简单的方法是确保(当你使用你控制的字体时)是直接使用具有日语字形的字体。 Arial Unicode仅仅是作为Windows的最后手段,当在其他字体中找不到字形时 - 而不是看起来很好看的东西。