Ale*_*tch 5 c# encoding drawimage
我试图在Image上写入某些字节,例如:
"་.༉ᵒᵗᵗ͟ᵋ͟͟͟͟͟͟͟͟͟͟͟͟͟͟͟͟͟͟͟͟͟"
当我在图像上显示它但我得到以下代替...
图片:

我已经尝试更改字符串的编码类型,当我收到字节并且没有设置字体但我尝试了所有默认的Microsoft字体以及我在Internet上找到的一些自定义字体.我究竟做错了什么?
编辑:原来正在使用Graphics.DrawString.我试过TextRenderer了,结果几乎相同.
图片:

这是我用来生成图像的代码:
string text = "[rotten4pple] ????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?. . .";
var font = new Font("Arial", 8, FontStyle.Regular);
var bitmap = new Bitmap(1, 1);
var size = Graphics.FromImage(bitmap).MeasureString(text, font);
bitmap = new Bitmap((int)size.Width + 4, (int)size.Height + 4);
using (var gfx = Graphics.FromImage(bitmap))
{
gfx.Clear(Color.White);
TextRenderer.DrawText(gfx, cmd.AllArguments, font, new Point(2, 2),
Color.Black, Color.White);
}
Run Code Online (Sandbox Code Playgroud)
变量cmd.AllArguments传递给方法,我相信字符串是Encoded using windows-1252.
不要用于Graphics.DrawStringunicode 字符。
您应该迁移到TextRenderer.DrawText,例如:
TextRenderer.DrawText(e.Graphics, "\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf", this.Font,\n new Point(10, 10), this.ForeColor, this.BackColor, flags);\nRun Code Online (Sandbox Code Playgroud)\n\n缺点是您无法指定Brush.
我已经测试过了。我想一定还有其他的事情发生,因为它似乎对我有用。这是我的代码:
\n\nprivate void Form1_Paint(object sender, PaintEventArgs e)\n{\n var text = " \xe0\xbc\x8d\xe0\xbc\x89\xe1\xb5\x92\xe1\xb5\x97\xe1\xb5\x97\xcd\x9f\xe1\xb5\x8b\xe0\xbc\x80\xef\xa3\xbf \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f. . . ";\n TextRenderer.DrawText(e.Graphics, "TextRenderer.DrawText" + text , this.Font,\n new Point(10, 10), this.ForeColor, this.BackColor);\n\n e.Graphics.DrawString("Graphics.DrawString" + text, this.Font,\n new SolidBrush(this.ForeColor), new PointF(10, 30));\n}\nRun Code Online (Sandbox Code Playgroud)\n\n注:字体为Arial Unicode MS 8.25pt.
输出:
\n\n
这是原始字符串,以 UTF-8 存储:
\n\n\n\n\n[烂4pple] \xe0\xbc\x8d\xe0\xbc\x89\xe1\xb5\x92\xe1\xb5\x97\xe1\xb5\x97\xcd\x9f\xe1\xb5\x8b\xe0\xbc\x80\ xef\xa3\xbf \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \xcd\x9f \ xcd\x9f\xcd\x9f\xcd\x9f\xcd\x9f\xcd\x9f\xcd\x9f\xcd\x9f\xcd\x9f。。。
\n
这是您得到的错误字符串,存储在 Windows-1252 中:
\n\n\n\n\n[烂4pple] \xc3\xa0\xc2\xbc\xc3\xa0\xc2\xbc\xe2\x80\xb0\xc3\xa1\xc2\xb5\xe2\x80\x99\xc3\xa1\xc2\xb5\xe2\ x80\x94\xc3\xa1\xc2\xb5\xe2\x80\x94\xc3\x8d\xc5\xb8\xc3\xa1\xc2\xb5\xe2\x80\xb9\xc3\xa0\xc2\xbc\xe2\ x82\xac\xc3\xaf\xc2\xa3\xc2\xbf\xc3\xb0\xc5\xb8\xc2\xa2\xc3\x8d\xc5\xb8\xc3\x8d\xc5\xb8\xc3\x8d\xc5\ xb8 \xc3\x8d\xc5\xb8 \xc3\x8d\xc5\xb8 \xc3\x8d\xc5\xb8\xc3\xb0\xc5\xb8\xc2\xa2 \xc3\x8d\xc5\xb8 \xc3\x8d\ xc5\xb8\xc3\x8d\xc5\xb8\xc3\x8d\xc5\xb8\xc3\x8d\xc5\xb8\xc3\x8d\xc5\xb8\xc3\x8d\xc5\xb8\xc3\xb0\xc5\ xb8\xe2\x80\xba \xc3\x8d\xc5\xb8 \xc3\x8d\xc5\xb8 \xc3\x8d\xc5\xb8 \xc3\x8d\xc5\xb8 \xc3\x8d\xc5\xb8 \xc3\ x8d\xc5\xb8\xc3\xb0\xc5\xb8\xc2\xa2。。。
\n
并且它们是二进制相等的。这是两个字符串的字节的十六进制表示形式:
\n\n5B 72 6F 74 74 65 6E 34 70 70 6C 65 5D 20 E0 BC\n8D E0 BC 89 E1 B5 92 E1 B5 97 E1 B5 97 CD 9F E1\nB5 8B E0 BC 80 EF A3 BF 20 F0 9F 90 A2 20 CD 9F\n20 CD 9F 20 CD 9F 20 CD 9F 20 CD 9F 20 CD 9F F0\n9F 90 A2 20 CD 9F 20 CD 9F 20 CD 9F 20 CD 9F 20\nCD 9F 20 CD 9F 20 CD 9F F0 9F 90 9B 20 CD 9F 20\nCD 9F 20 CD 9F 20 CD 9F 20 CD 9F 20 CD 9F F0 9F\n90 A2 2E 20 2E 20 2E\nRun Code Online (Sandbox Code Playgroud)\n\n由于这是对二进制值的重新解释而不是重新编码,因此在Encoding.Convert.NET 中从一种值转换为另一种值是不可行的。相反,您应该以错误的编码获取字符串的二进制表示形式,并将其直接读取为正确的编码:
var text = cmd.AllArguments;\nvar bytes = Encoding.GetEncoding(1252).GetBytes(text);\ntext = Encoding.UTF8.GetString(bytes);\nRun Code Online (Sandbox Code Playgroud)\n\n笔记
\n\n您一直在询问您默认使用的 API 使用什么编码。我不熟悉您正在使用的 API...但是,它存在依赖于机器配置的风险。您应该寻找允许您指定接收 UTF-8 字符串的重载。
\n\n无论如何,您很可能实际上收到了一个byte[],因此您可以Encoding.UTF8.GetString直接使用它。如果无法指定编码,则应考虑改用发送byte[],这样做的目的是对编码有更多的控制。
在这方面,不要使用,Encoding.Default因为它将是机器语言的扩展 ASCII。
顺便说一句,UTF-8 对于网络来说是一个不错的选择,不仅因为它独立于语言和其他区域配置,还因为它独立于字节顺序(字节序)。
\n| 归档时间: |
|
| 查看次数: |
625 次 |
| 最近记录: |