win7系统和软件部分乱码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win7系统和软件部分乱码相关的知识,希望对你有一定的参考价值。
win7 64位,已经确定是系统编码问题了。区域和语言已经是简体中文和中国了,系统和一些软件只有部分界面乱码。用命令chcp得到编码是437,用命令mode con cp select=936改不回来,如图。请问怎么办?
参考技术A 首先在控制面板中,将系统时区、语言等的设定搞定。相信你已经试过了,不行话是下面的。打开注册表键
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FontAssoc\Associated
Charset
确定下面这两项的值是
YES。如果没有则自己创建。
"ANSI(00)"="YES"
"OEM(FF)"="YES"
如果还是没有解决,那就进行下面这步。
打开注册表键
HKEY_CURRENT_USER\ControlPanel\International,将右侧的:"Locale"="00000409"
改成
"Locale"="00000804"
然后重启,看看问题解决了没。
要是连这个都不管用,我也没办法了,重新装个系统吧。
win7藏文打印部分文字乱码问题处理
使用C#打印藏文的过程中发现,在win7上部分藏文会出现乱码和错误,不是所有藏文都会出现乱码,在win10上是没有问题。而且同样的藏文,如果是winform的label标签的藏文也不是乱码,但如果调用Graphics对象的DrawString就是错误的。于是开始查找label标签的文字的打印和Graphics的打印有什么不一致,发现,winform的文字基本上都是调用TextRenderer,而不是Graphics。但官网上特别强调了打印不能使用TextRenderer。
但是实在没有思路,于是测试打印能不能使用,发现TextRenderer其实是可以使用的,不过有一些限制。例如:坐标位置是不对的,字体的大小也不正确,有些参数必须是指定值。
最终经过测试发现,应该把文字分成两类,藏文,和其他的文字。如果是其他的文字,就是用
Graphics打印,如果是藏文就使用TextRenderer来打印,最终效果基本可以使用。
/// <summary>
/// win7上藏文打印才有问题,win10是没有问题的
/// </summary>
/// <param name="g"></param>
/// <param name="text"></param>
/// <param name="pxFont"></param>
/// <param name="color"></param>
/// <param name="textStartPoint"></param>
private static void DrawSingleLineInputMutiValueForPrintInner(Graphics g,string text, Font pxFont, Color color, Point textStartPoint)
Point textStartLocation = textStartPoint;
List<string> list = GetList(text);//把文字分成藏文,非藏文两部分
for (int i = 0; i < list.Count; i++)
string temp = list[i];
char c = temp[0];
bool iszangwen = IsZangwen(c);
SizeF textSize = g.MeasureString(temp, pxFont);
if (iszangwen)//是藏文,使用特殊的打印方法
DrawText(g,temp, pxFont, color, textStartPoint, textSize);
else//不是藏文,使用原来的打印方法
using (Brush brush = new SolidBrush(color))
g.DrawString(temp, pxFont, brush, textStartPoint.X, textStartPoint.Y);
textStartPoint.X += (int)textSize.Width;
/// <summary>
/// 藏文打印
/// 使用系统默认的藏文字体 Microsoft Himalaya
/// </summary>
/// <param name="g"></param>
/// <param name="text"></param>
/// <param name="pxFont"></param>
/// <param name="color"></param>
/// <param name="textStartPoint"></param>
private static void DrawText(Graphics g,string text, Font pxFont, Color color, Point textStartPoint, SizeF textSize)
PointF ptF = new PointF(textStartPoint.X, textStartPoint.Y);
ptF.Y -= ptF.Y / Getx(ptF.Y);//藏文的坐标需要变化
ptF.X -= ptF.X / Getx(ptF.X); // 藏文的坐标需要变化
GraphicsUnit pageUnit = g.PageUnit;
float dpiX = g.DpiX;
float dpiY = g.DpiY;
Matrix transform = g.Transform;
float num7 = transform.Elements[0];
float num8 = transform.Elements[3];
float fontheignth = ((pxFont.Size * num7) * dpiX) / 96f;//字体的大小也需要变化
ptF.X *= (float)num7;
ptF.Y *= num8;
ptF.X += transform.OffsetX;
ptF.Y += transform.OffsetY;
ptF.X = (float)GraphicsUnitConvert.ToPixel((double)ptF.X, pageUnit, dpiX);
textSize.Width = (float)GraphicsUnitConvert.ToPixel((double)textSize.Width, pageUnit, dpiX);
ptF.Y = (float)GraphicsUnitConvert.ToPixel((double)ptF.Y, pageUnit, dpiY);
textSize.Height = (float)GraphicsUnitConvert.ToPixel((double)textSize.Height, pageUnit, dpiX);
Rectangle rectangle = new Rectangle((int)ptF.X, (int)ptF.Y, (int)textSize.Width, (int)textSize.Height);
using (Font value4 = new Font("Microsoft Himalaya", fontheignth, pxFont.Style, GraphicsUnit.Pixel))
TextRenderer.DrawText(g, text, value4, rectangle, color, TextFormatFlags.NoPadding | TextFormatFlags.NoClipping);
// Point p = new Point((int)ptF.X, (int)ptF.Y);
// TextRenderer.DrawText(g, text, value4, p, color, TextFormatFlags.NoPadding | TextFormatFlags.NoClipping);
/// <summary>
/// 藏文坐标偏移量
/// 线性模拟的结果,不要问我为什么,这是我测试的调整的结果
/// -0.004f * x + 28.987f;
/// 0.000003f * x * x - 0.0072f * x + 29.657f;
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
private static float Getx(float x)
return -0.004f * x + 28.987f;
/// <summary>
/// 藏文和非藏文多个部分
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
private static List<string> GetList(string text)
List<string> list = new List<string>();
int type = 0;
string curretntext = string.Empty;
for (int i = 0; i < text.Length; i++)
char c = text[i];
int curenttype = 0;
bool iszangwen = IsZangwen(c);
if (iszangwen)//是藏文
curenttype = 2;
else
curenttype = 1;
if (curenttype != type)
type = curenttype;
if (curretntext != "")
list.Add(curretntext);
curretntext = c + "";
else
curretntext += c;
if (curretntext != "")
list.Add(curretntext);
return list;
/// <summary>
/// 是不是藏文
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
private static bool IsZangwen(char c)
if (c >= 0x0F00 && c <= 0x0FFF)//是藏文
return true;
return false;
以上是关于win7系统和软件部分乱码的主要内容,如果未能解决你的问题,请参考以下文章