Base64字符 转图片乱码问题

摘要:
经过初步分析,这应该是由于系统环境的差异造成的。1.最初,人们认为这是字符编码和解码的问题,但base64本身使用了ascii字符集,并且不存在编码集不正确的问题。

网站做了个随机验证码图片功能,遇到了一个奇怪的问题——Base64字符集转图片乱码问题,问题描述如下

1.用java画笔将随机验证码绘制成图片

2.再将图片的二进制代码转换成Base64字符集,返回给前端,

以上步骤,在本地window环境下,随机验证码图片生成base64字符传送到前端,能完美解析出来,但是部署到生产环境(centos)上,则解析base64字符得到的是一张乱码图片。

经过初步分析,应该是系统环境差异造成的,

1.一开始以为是字符编码和解码的问题,但base64本身是用ascii字符集,本身不存在编码集不对的问题。所以排除字符集解码和编码不对的问题。

2.接着,检查了下生成的base64字符的长度,2207个字符,远没达到string的最大字符长度。

3.那么有没有可能是绘制的图片本身就是乱码的,base64字符还原出的图片是没问题的。因此仔细看下绘制随机验证码的代码

 public static String outputRandomImageDataUrl(String randomString)
            throws IOException {
        int width = 100;
        int height = 30;

        Color color = getRandomColor();
        Color reverse = getReverseColor(color);

        BufferedImage bi = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g = bi.createGraphics();
        g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));
        g.setColor(color);
        g.fillRect(0, 0, width, height);
        g.setColor(reverse);
        g.drawString(randomString, 18, 20);
        for (int i = 0, n = random.nextInt(100); i < n; i++) {
            g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);
        }

        return DATAURL_PREFIX + ImageConvertUtils.imageConvertBase64(bi);
    }

  然后发现这句

  g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));
字体是微软雅黑字体,linux系统已办是肯定是不会有这个字体的,于是本人在生产环境检查了下系统字符集,果然没有,找到问题所在,那么就很好解决了。
1.程序代码中选择一个生产环境已有的字体。
2.安装程序指定的字体。
本人是采用第二种方式,安装了微软雅黑字体后果然ok了

免责声明:文章转载自《Base64字符 转图片乱码问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows访问令牌模拟窃取以及利用(T1134)Azure和aws使用对比下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

字符编码转换

1.调用webservice接口时iconv()函数报错,不知道什么原因,改成mb_convert_encoding()就可以了。    具体事例:                $content = iconv("GBK", "UTF-8″, $content);             //不好使                $content = m...

sql server 2008安装图解

本篇文章介绍了安装SQL Server 2008企业版的软硬件配置要求,安装过程的具体步骤,以及须要注意的事项。 步骤/方法 1 在这里我们将用图解的方式。来介绍SQL Server 2008安装和配置过程。希望对大家有所帮助。 2 选择版本号,或者输入密钥自己主动识别版本号...

利用mysql对特殊字符和超长字符会进行截断的特性 进行存储型XSS攻击——WordPress &amp;lt;4.1.2 &amp;amp; &amp;lt;=4.2 存储型xss

转自:Baidu Security Lab Xteam http://xteam.baidu.com/?p=177 漏洞概述 本次漏洞出现两个使用不同方式截断来实现的存储型xss,一种为特殊字符截断,一种为数据库字段长度截断,该漏洞导致攻击者可获取用户 cookie以及模拟浏览器正常操作,并且当管理员访问到注入的payload时,结合wordpress后台...

linux基础知识-23

一、常识 (一) 文件 linux中将每个进程上下文之外需要保存的信息保存在文件中。linux采用简单模式保存信息,即信息以单一字节序列从头保存到尾。 序列的字节长度就是文件的长度。 文件中保存了什么?文本信息,图片信息,二进制信息等。 (二) 字节 8个位为一组,称为字节。即一个字节包含8个比特(bit)。每个bit值域{0,1},8位一共可以有2^8个...

Java邮件发送与接收原理

一、 邮件开发涉及到的一些基本概念 1.1、邮件服务器和电子邮箱   要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。   这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中...

OC-字符串

     字符串 一.不可变字典:    1.字符串格式化处理 int age = 20; NSString *name = @"陈真"; NSString *info = [NSString stringWithFormat:@"%@今年%d",name,age];         NSLog(@"%@",info);    2.截取字典       ...