流程图片浮现乱码难点分析与解决,MySql踩坑总括

  后天配备了刹那间晚上的token,不过不精晓怎么回事就是安顿不成事,在网上找了多的章程也并未化解了那几个标题,可是最后做在3个论坛上找到了缓解的艺术。真是激动的不用不要的,话不多说一贯怼代码。

Activiti新手常见的题材是,铺排成功流程后,获取展现的流程图片(PNG)为乱码,主要体现为华语不可能正确呈现。在此地分析一下乱码出现的由来,以及消除方案。不喜欢问为何的同学能够一向跳到消除办法段落。

衣带渐宽终不悔,为伊消得人憔悴,众里寻他千百度,蓦然回首,那人却在灯火阑珊处好通顺的句子哈哈

前几天向MySQL数据库中的一张表添加含有中文的多寡,但是老是出十分,检查程序并从未发现错误,无奈啊,后来再也检查那张表发现表的编码形式为latin1并且原想能够插入粤语的字段的编码格局也是latin1,然后重新精心考察控制台出口的非常,进一步规定是表和表中字段编码不当造成的,那就修改表和个中对应的字段呗,网上找了会儿,你别说还真有,执行完sql脚本后果真可以存入普通话了,固然如此照旧认为有必不可少总括一下,古人云:好记性不如烂笔头嘛,呵呵呵。

  那么些是微信公众平台上的配置。

表现

Activiti流程图乱码常见有三种状态:

  1. 具有汉语字符变成方块
![](https://upload-images.jianshu.io/upload_images/4770110-6e2cda534300a7ad.png)
  1. 具备汉语字符变成浮泛汉字
![](https://upload-images.jianshu.io/upload_images/4770110-a3f85b063efed71b.png)

以致那两种情状的错误原因以及消除措施并分裂,但都与Activiti布置、生成流程图的法子有关。上边先介绍Activiti的流程图生成方式。

转了那么多弯,才明白问题就在一个地方。睡觉在此之前想清楚了难题,照旧经验太少。王静安的治学三境界:

修改表的编码格局:ALTE奥迪Q5 TABLE `test` DEFAULT CHARACTE大切诺基 SET
utf8;该命令用于将表test的编码情势改为utf8;

  www.5929.com 1

背景介绍

流程图片浮现乱码难点分析与解决,MySql踩坑总括。Activiti中,使用的流水生产线定义一般都以相符BPMN2.0行业内部的xml文本文件,后缀能够是.bpmn20.xml,.xml。个中蕴蓄了工艺流程的满贯概念内容,包罗各节点、节点关联关系,以及用于定义显示的DI成分。

在陈设流程定义时,Activiti引擎会判断,是不是还要提供了流程图像和文字件?假设一起提供了流程图像和文字件,Activiti就省心了,直接动用这几个文件作为流程图。

流程图片浮现乱码难点分析与解决,MySql踩坑总括。一般的话大家都不会先构建好流程图像和文字件再布局,也正是说,安顿时唯有一个xml文件。那时候Activiti就供给团结生成对应的流程图像和文字件了。

流程图像和文字件会保存在Activiti的数据库ACT_GE_BYTEA凯雷德RAY表中,作为BLOB保存。各个流程对应三个流程图像和文字件。故此流程图在计划时就曾经明确,除非重新铺排或手动处理,不然不管配置怎么修改,突显的都以早期的流程图。

Activiti用于生成流程图的工具类是

org.activiti.image.impl.DefaultProcessDiagramGenerator

这几个类不止能够生成流程图,还能生成流程运营状态图。具体能够参见个中各艺术的注解。

明早强风凋碧树,独上高楼,望尽天涯路

衣带渐宽终不悔,为伊消得人憔悴

众里寻他千百度,蓦然回首,那人却在灯火阑珊处

修改字段的编码格局:ALTESportage TABLE `test` CHANGE `name` `name`
VAEscortCHA昂科雷(36) CHARACTEEnclave SET utf8 NOT NULL;
该命令用于将表test中name字段的编码格局改为utf8

  那边的url值要直接点到文件上,不然不会成功.  

阴差阳错原因剖析

www.5929.com 2

您或者感兴趣的篇章:

  • 使MySQL能够存款和储蓄emoji表情字符的安装教程
  • MySQL插入emoji表情退步难题的化解方法
  • 让Java后台MySQL数据库能够帮助emoji表情的不二法门
  • MySQL不可能存款和储蓄Emoji表情难题的化解措施分析
  • 健全摸底mysql中utf8和utf8mb4的区分
  • MySQL查看与修改当前数据库编码的章程
  • Mysql数据库编码问题(修改数据库,表,字段编码为utf8)
  • MySQL查看和改动字符编码的兑现情势
  • mysql存款和储蓄emoji表情报错的处理方式【更改编码为utf8mb4】

接下来后台的装置

普通话字符变成方块

在布局流程时,生成流程图的代码位于

org.activiti.engine.impl.bpmn.deployer.BpmnDeployer.deploy():154 (Activiti 5.22中)

byte[] diagramBytes = IoUtil.readInputStream(processEngineConfiguration.
                    getProcessDiagramGenerator().generateDiagram(bpmnParse.getBpmnModel(), "png", processEngineConfiguration.getActivityFontName(),
                        processEngineConfiguration.getLabelFontName(),processEngineConfiguration.getAnnotationFontName(), processEngineConfiguration.getClassLoader()), null);

看得出在此处,须要在processEngineConfiguration里,保存有正确的LabelFontName,以及AnnotationFontName作为参数,Generator才能科学生成(非英文)的流水生产线图片。

[TOC]

 1 <?php
 2 namespace app\weixin\controller;
 3 
 4 use think\Controller;
 5 
 6 define("TOKEN", "******");//这里要输入你的token值
 7 
 8 // $wechatObj = new wechatCallbackapiTest();
 9 
10 // $wechatObj->valid();
11 
12 class Wx2 extends Controller {
13     
14     public function index()  
15     {  
16         $echoStr = $_GET["echostr"];  
17   
18         //valid signature , option  
19         if($this->checkSignature()){  
20             ob_clean(); //丢弃缓存中的内容
21             echo $echoStr;  
22             exit;  
23         }  
24     }  
25   
26     public function responseMsg()  
27     {  
28         //get post data, May be due to the different environments  
29         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  
30   
31         //extract post data  
32         if (!empty($postStr)){  
33                   
34                 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);  
35                 $fromUsername = $postObj->FromUserName;  
36                 $toUsername = $postObj->ToUserName;  
37                 $keyword = trim($postObj->Content);  
38                 $time = time();  
39                 $textTpl = "<xml>  
40                             <ToUserName><![CDATA[%s]]></ToUserName>  
41                             <FromUserName><![CDATA[%s]]></FromUserName>  
42                             <CreateTime>%s</CreateTime>  
43                             <MsgType><![CDATA[%s]]></MsgType>  
44                             <Content><![CDATA[%s]]></Content>  
45                             <FuncFlag>0</FuncFlag>  
46                             </xml>";               
47                 if(!empty( $keyword ))  
48                 {  
49                     $msgType = "text";  
50                     $contentStr = "Welcome to wechat world!";  
51                     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);  
52                     echo $resultStr;  
53                 }else{  
54                     echo "Input something...";  
55                 }  
56   
57         }else {  
58             echo "";  
59             exit;  
60         }  
61     }  
62           
63     private function checkSignature()  
64     {  
65         $signature = $_GET["signature"];  
66         $timestamp = $_GET["timestamp"];  
67         $nonce = $_GET["nonce"];      
68                   
69         $token = TOKEN;  
70         $tmpArr = array($token, $timestamp, $nonce);  
71         sort($tmpArr,SORT_STRING); 72         $tmpStr = implode( $tmpArr );  
73         $tmpStr = sha1( $tmpStr );  
74           
75         if( $tmpStr == $signature ){  
76             return true;  
77         }else{  
78             return false;  
79         }  
80     }
81 
82 
83 }
中文字符变成浮泛汉字

并发那种难点,基本上都是在Activiti提供的demo程序——Explorer中布署、布置流程的时候现身的。原因是demo程序有bug。

Activiti Explorer中提供的Activiti
Modeler,是贰个Web流程设计器。用于编辑、保存流程模型。那里请留心,无法用来新建,它生成的也只是流程模型,不是流程定义。生成的流程模型是Json格式的,也保留在ACT_GE_BYTEARRAY表中。

然后在Activiti Explorer中提供了“陈设”的操作。对应的代码为(Activiti
5.2第22中学)(实际有多少个布局格局,可是画线安插的是以此。另三个是填表单格局安排,难点类似)

org.activiti.editor.ui.EditorProcessDefinitionDetailPanel.deployModelerModel()

protected void deployModelerModel(final ObjectNode modelNode) {
    BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
    byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);

    String processName = modelData.getName() + ".bpmn20.xml";
    Deployment deployment = repositoryService.createDeployment()
            .name(modelData.getName())
            .addString(processName, new String(bpmnBytes))
            .deploy();

    ExplorerApp.get().getViewManager().showDeploymentPage(deployment.getId());
}

忽视是,将Modeler的数码格式(Json
modelNode),转换为Activiti内部交流格式(BpmnModel
model),再转成xmlbyte(byte[]
bpmnBytes),然后在布局的时候再作为String参预陈设
.addString(processName, new String(bpmnBytes))

很绕是还是不是?Activiti的开发者也把团结绕晕了,导致那里出现了bug。

public byte[] convertToXML(BpmnModel model) {
  return convertToXML(model, DEFAULT_ENCODING);
}

转换为xmlbyte的方法里,钦定了编码方式(为UTF-8)。不过再转回字符串的时候,却从未点名编码格局!
new String(bpmnBytes)

在未钦定编码情势的时候,new
String使用jvm定义的私下认可编码形式解析,而小编辈一般选择的都以gb2312,因而导致难题。

数据源配置的题材

实际能够看
这里

本地连接可以,连接受服务器就是不行,愣是不行。笔者刚开端觉得是“APPARENT
DEADLOCK!!!”的难点,各类google方法,试了三次依然那些。都快绝望了,深夜海体育场面书馆也在试依旧不曾缓解。上午睡觉的时候猛然想起来,笔者MyEclipse好像屏蔽掉了拥有往外的接连,( ̄▽ ̄;),真是搬起石头砸自个儿的脚,给协调设置障碍。早晨一来,将再三再四松手,好题材消除。贴一下DBCP数据源的布局

#数据库驱动
driverClassName=com.mysql.jdbc.Driver
#数据库连接地址
url=jdbc:mysql://服务器地址:3306/dbWaterColInfo
#用户名
username=root
#密码
password=root

#连接池的最大数据库连接数。设为0表示无限制
maxActive=30
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连
#接将被标记为不可用,然后被释放。设为0表示无限制
maxIdle=10
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制
maxWait=1000

#超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true) 
removeAbandoned=true
#超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
removeAbandonedTimeout=180

//DBCP管理类,也是从网上找的
package com.kuiblog.utils;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DBCPManager {
    private static final Log log = LogFactory.getLog(DBCPManager.class);
    private static final String configFile = "这里替换成你的实际配置文件";

    private static DataSource dataSource;

    static {
        Properties dbProperties = new Properties();
        try {
            dbProperties.load(DBCPManager.class.getClassLoader()
                    .getResourceAsStream(configFile));
            dataSource = BasicDataSourceFactory.createDataSource(dbProperties);

            Connection conn = getConn();
            DatabaseMetaData mdm = conn.getMetaData();
            log.info("Connected to " + mdm.getDatabaseProductName() + " "
                    + mdm.getDatabaseProductVersion());
            if (conn != null) {
                conn.close();
            }
        } catch (Exception e) {
            log.error("初始化连接池失败:" + e);
        }
    }

    private DBCPManager(){

    }
    /**
     * 获取链接,用完后记得关闭
     * 
     * @see {@link DBManager#closeConn(Connection)}
     * @return
     */
    public static final Connection getConn() {
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            log.error("获取数据库连接失败:" + e);
        }
        return conn;
    }

    /**
     * 关闭连接
     * 
     * @param conn
     *            需要关闭的连接
     */
    public static void closeConn(Connection conn) {
        try {
            if (conn != null && !conn.isClosed()) {
                conn.setAutoCommit(true);
                conn.close();
            }
        } catch (SQLException e) {
            log.error("关闭数据库连接失败:" + e);
        }
    }
}

采取DBCP须求导入五个包加2个log包。commons-dbcpcommons-poolcommons-logging

下一场就足以放心大胆的选拔了

  假使那种措施也非凡的,只有修改编码格局来施行了,修改编码情势在网上有诸多,自个儿不论一招来就出去,

消除方法

重新强调,修改之后,必要重新安顿或手动生成流程图片,才能看出效果!

数据库编码难点

在产出数据库编码难点从前自个儿还遇上了一个小意思,那正是自个儿通过DBUtils操作数据库,执行SELECT * FROM userInfos_t能够查询到具备的内容,然后参数化查询就10分,比如SELECT * FROM userInfos_t WHERE name='张三',但是SELECT * FROM userInfos_t WHERE id =2却得以,也是百思不得解,好吧。也是数据库编码的题材。即便本身在Navicat for mysql中寓指标是’张三’,但数据库编码格局并不是UTF8,所以本身查找是寻觅不出来的。

  1. 首先查看数据库的字符集

show variables like 'collation_%';

www.5929.com 3

那是小编修改之后的,原先的都是latin1

  1. 网上涉及了广大消除格局,一定要过细看。

    自小编的Mysql版本是5.7,做了之类修改成功了

    修改/etc/mysql/my.cnf

    [client]
    default-character-set=utf8
    [mysqld]
    default-storage-engine=INNODB
    character-set-server=utf8
    collation-server=utf8_general_ci
    

    怎么找my.cnf

    locate my.cnf
    //如果找不到的话
    updatedb,//然后在查找
    

    重启Mysql服务

    service mysqld restart
    
也可以查看[这篇文章](http://www.pc6.com/infoview/article_63586.html)

来解决

总结
====

暂时的问题就这样多,用了`DBUtil`,没有用`Hibernate`,等以后学习学习再用。

### 文章首发于kuiblog.com。加油

  明天就享受到那里,然后觉得自身写的不利的请推荐,多谢

华语字符变成方块

在Activiti的计划中,加上字体配置即可。

对于Spring用户,在Spring配置文件中找到Activiti流程引擎定义的地点

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
    <property name="dataSource" ref="dataSource"/>
    <property name="transactionManager" ref="transactionManager"/>
    <property name="databaseSchemaUpdate" value="true"/>
    ...

在里面添加多少个参数(根据Activiti的本子不一致,参数数量不自然。用IDE提示,把拥有带有font的都设置上就好了)。字体能够依据喜好设置,但要求确定保证tomcat运维时得以找到(例如暗中认可安装的linux服务器非常的大概就从不)。

<property name="activityFontName" value="宋体"/>
<property name="labelFontName" value="宋体"/>
<property name="annotationFontName" value="宋体"/>

重启tomcat使配置生效,重新安插流程以重新生成流程图。方块字就ok啦。

 

汉语字符变成浮泛汉字

鉴于难点出在编码形式上,因而有三种修章

1. 修改jvm暗中同意参数。

在tomcat的vm运行参数上,加上-Dfile.encoding=UTF-8。但是副功用是导致整个项目都运作在utf-8下,对于写的不战战兢兢的花色,可能造成其余地点暗中认可使用gb2312编码的代码出错。

2. 修改Explorer陈设部分的代码

org.activiti.editor.ui.EditorProcessDefinitionDetailPanel.deployModelerModel():348
修改为.addString(processName, new String(bpmnBytes, "UTF-8"))即可。

  • 能够向来修改activiti的源码,编写翻译后选用。

  • www.5929.com,也得以在自个儿的档次下,手动创设org.activiti.editor.ui.EditorProcessDefinitionDetailPanel类,把Activiti的源码贴进去,再修改进确。那样我们重写的类就会由classloader优先加载,覆盖Activiti自身的贯彻,达到修改的指标。

3. 说到底Explorer只是Activiti提供的demo样例。自身写的时候,能够参考Explorer的代码,可别直接拿来用哦。
展现字符为空白

以此严谨来说并不是“乱码”,消除格局也很简短:画流程图的时候,少写多少个字,或然把规模拖动搞大学一年级些就能够了~

Leave a Comment.