win7藏文打印部分文字乱码问题处理

Posted xuexiaodong2009

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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藏文打印部分文字乱码问题处理的主要内容,如果未能解决你的问题,请参考以下文章

win7藏文打印部分文字乱码问题处理

win7藏文打印部分文字乱码问题处理

Arduino 的 Serial.write 和 Serial.print 的区别在哪里

部分 win7 电脑调出lodop打印预览显示不全 文字文本过长不能自动换行

中文转换藏文

win7系统和软件部分乱码