I create an image in C# which should contain some text in Japanese. Then I put this image into the whole page which is also in Japanese. The whole page is displayed correctly (Encoding: UTF-8), but the image is rendered incorrectly. Instead of the correct text I get wrong symbols (not ‘?’ but something similar to square).
I need to write this text on image in Arial. Does anyone know what might be wrong? Why text is not rendered correctly.
And one more think… when I test it on my local machine everything looks correctly, but when I deploy app with page on external server this strange error occurs.
In order to create image with text I use:
Font f = Font("Arial", 10f, FontStyle.Bold);
g.DrawString(text, f, b, rect);
The external server likely has a version of Arial installed, which doesn’t include the Japanese character set (as far as I recall, the one that includes Japanese is called “Arial Unicode MS”). Remember that when you’re generating an image in ASP.NET, it’s the servers fonts that are used.
Note, however, that legally, you’re not allowed to install “Arial Unicode MS”, except when it’s part of Office – or if you’ve licensed it (“Arial Unicode”) from Monotype/Ascender. It may be a more viable option to replace Arial with some other typeface, depending on your funds (I’ll keep my subjective opinions on Arial out of this).
When installing a new font on the server, make sure you restart IIS. .NET won’t recognize installed fonts until a restart (it’s not enough to restart the application – may be enough to recycle the app pool, but I never tried that).
Update
If it still doesn’t work, it’s likely font fallback isn’t in place. I.e., you’re specifying “Arial”, but GDI+ (
DrawString) doesn’t know to fall back to “Arial Unicode MS” for characters that aren’t in Arial (Office sets this up on install, I think).Two possibilities:
Change your code to actually use the font (i.e. “Arial Unicode MS”) rather than “Arial” (which never has Japanese characters in any other versions). This has the disadvantage that if you’re using other characters than Japanese, they may look (even) less good than in the standard “Arial” typeface, because “Arial Unicode MS” includes no kerning or other such features.
Or check if there’s a link between Arial and other fonts in your (local) registry:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink– one of those fonts will be the one actually displaying your Japanese characters as a fallback font – it may not even be “Arial Unicode”. You may add the same link manually in registry on the server (and probably restart IIS again).Another likely candidate that may be used for fallback is “MS Gothic”. As far as I recall, GDI+ uses the above “FontLink” system for font fallback, while WPF uses its own system. The easiest way to be sure (when you’re using fonts that you control anyway) is to directly use a font that has Japanese glyphs. Arial Unicode is merely intended as a last resort for Windows when glyphs aren’t found in other fonts – not as something that looks nice in itself.