Skip to content

Commit ebf6e06

Browse files
committed
添加传输工具文件编码转换功能
1 parent eec4d57 commit ebf6e06

6 files changed

Lines changed: 147 additions & 1 deletion

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ Filter处理器:
139139
| PythonScript | FilterConfigPythonScript | 将执行Python脚本 |
140140
| JavaScript | FilterConfigJavaScript | 将执行JavaScript脚本 |
141141
| LuaScript | FilterConfigLuaScript | 将执行Lua脚本 |
142+
| UnicodeTransformation | FilterConfigUnicodeTransformation | 将消息编码进行转换 |
142143

143144
Sender发送器:
144145

@@ -169,7 +170,6 @@ Sender发送器:
169170
- [ ] 随机文件生成器(带模版引擎)
170171
- [x] 文件搜索功能
171172
- [ ] OCR小工具
172-
- [ ] 文件编码转换工具
173173

174174
#### 项目结构
175175

README_EN.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ Filter:
138138
| PythonScript | FilterConfigPythonScript | Will execute Python script |
139139
| JavaScript | FilterConfigJavaScript | Will execute a JavaScript script |
140140
| LuaScript | FilterConfigLuaScript | Will execute the Lua script |
141+
| UnicodeTransformation | FilterConfigUnicodeTransformation | Encode the message for conversion |
141142

142143
Sender:
143144

src/main/java/com/xwintop/xJavaFxTool/controller/developTools/xTransferTool/TransferToolTaskViewController.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ public void changed(ObservableValue<? extends String> observable, String oldValu
204204
"FilterConfigPythonScript",
205205
"FilterConfigJavaScript",
206206
"FilterConfigLuaScript",
207+
"FilterConfigUnicodeTransformation",
207208
};
208209
for (String className : classNameS) {
209210
MenuItem menuAdd = new MenuItem(className);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.xwintop.xTransfer.filter.bean;
2+
3+
import lombok.Data;
4+
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
8+
/**
9+
* @ClassName: FilterConfigUnicodeTransformation
10+
* @Description: 编码转换工具
11+
* @author: xufeng
12+
* @date: 2019/8/21 18:05
13+
*/
14+
15+
@Data
16+
public class FilterConfigUnicodeTransformation implements FilterConfig {
17+
private String serviceName = "filterUnicodeTransformation";//对应服务名称
18+
private String id;//如果留空则系统自动分配
19+
private boolean enable = true;//是否开启
20+
private boolean async = false;//是否异步执行
21+
private boolean exceptionExit = true;//是否发生异常时退出任务
22+
private String fileNameFilterRegex;//文件名过滤正则表达式(?!为剩余未过滤的,需放同组最后)
23+
private String fileNameFilterRegexGroup;//文件名过滤正则表达式分组
24+
25+
private String oldEncoding = null;//原文件编码(null为保持输入端编码,AUTO为自动识别文件编码)
26+
private String newEncoding = null;//转换后编码(null为不转换)
27+
private Map args = new HashMap();//自定义参数
28+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.xwintop.xTransfer.filter.service.impl;
2+
3+
import com.xwintop.xTransfer.filter.bean.FilterConfig;
4+
import com.xwintop.xTransfer.filter.bean.FilterConfigUnicodeTransformation;
5+
import com.xwintop.xTransfer.filter.service.Filter;
6+
import com.xwintop.xTransfer.messaging.IContext;
7+
import com.xwintop.xTransfer.messaging.IMessage;
8+
import com.xwintop.xTransfer.util.Common;
9+
import lombok.Data;
10+
import lombok.extern.slf4j.Slf4j;
11+
import org.apache.commons.lang3.StringUtils;
12+
import org.springframework.context.annotation.Scope;
13+
import org.springframework.stereotype.Service;
14+
15+
import java.util.Map;
16+
17+
/**
18+
* @ClassName: FilterUnicodeTransformationImpl
19+
* @Description: 编码转换工具类
20+
* @author: xufeng
21+
* @date: 2019/8/21 18:07
22+
*/
23+
24+
@Service("filterUnicodeTransformation")
25+
@Scope("prototype")
26+
@Data
27+
@Slf4j
28+
public class FilterUnicodeTransformationImpl implements Filter {
29+
private FilterConfigUnicodeTransformation filterConfigUnicodeTransformation;
30+
31+
@Override
32+
public void doFilter(IContext ctx, Map params) throws Exception {
33+
for (IMessage iMessage : ctx.getMessages()) {
34+
if (StringUtils.isNotBlank(filterConfigUnicodeTransformation.getFileNameFilterRegex())) {
35+
String fileNameFilterRegexGroup = filterConfigUnicodeTransformation.getFileNameFilterRegexGroup();
36+
if (StringUtils.isEmpty(fileNameFilterRegexGroup)) {
37+
fileNameFilterRegexGroup = "defaultRegexGroup";
38+
}
39+
if ("?!".equals(filterConfigUnicodeTransformation.getFileNameFilterRegex())) {
40+
if (iMessage.checkFileNameFilterRegexGroup(fileNameFilterRegexGroup)) {
41+
log.info("Filter:" + filterConfigUnicodeTransformation.getId() + "跳过fileName:" + iMessage.getFileName());
42+
continue;
43+
}
44+
} else {
45+
if (!iMessage.getFileName().matches(filterConfigUnicodeTransformation.getFileNameFilterRegex())) {
46+
log.info("Filter:" + filterConfigUnicodeTransformation.getId() + "跳过fileName:" + iMessage.getFileName());
47+
continue;
48+
}
49+
iMessage.addFileNameFilterRegexGroup(fileNameFilterRegexGroup);
50+
}
51+
}
52+
doFilter(iMessage);
53+
}
54+
}
55+
56+
public void doFilter(IMessage msg) throws Exception {
57+
if (StringUtils.isNotEmpty(filterConfigUnicodeTransformation.getOldEncoding())) {
58+
if ("AUTO".equalsIgnoreCase(filterConfigUnicodeTransformation.getOldEncoding())) {
59+
String charset = Common.detectFileCharset(msg.getMessage());
60+
log.info("检测到文件:" + msg.getFileName() + "编码:" + charset);
61+
msg.setEncoding(charset);
62+
} else {
63+
msg.setEncoding(filterConfigUnicodeTransformation.getOldEncoding());
64+
}
65+
}
66+
if (StringUtils.isNotEmpty(filterConfigUnicodeTransformation.getNewEncoding()) && !filterConfigUnicodeTransformation.getNewEncoding().equalsIgnoreCase(msg.getEncoding())) {
67+
byte[] newBytes = msg.getMessageByString().getBytes(filterConfigUnicodeTransformation.getNewEncoding());
68+
msg.setMessage(newBytes);
69+
msg.setEncoding(filterConfigUnicodeTransformation.getNewEncoding());
70+
}
71+
}
72+
73+
@Override
74+
public void setFilterConfig(FilterConfig filterConfig) throws Exception {
75+
this.filterConfigUnicodeTransformation = (FilterConfigUnicodeTransformation) filterConfig;
76+
}
77+
78+
@Override
79+
public void destroy() {
80+
}
81+
}

src/main/java/com/xwintop/xTransfer/util/Common.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
import lombok.extern.slf4j.Slf4j;
44
import org.apache.commons.lang3.StringUtils;
55
import org.apache.commons.lang3.time.DateFormatUtils;
6+
import org.mozilla.universalchardet.UniversalDetector;
67

8+
import java.io.ByteArrayInputStream;
79
import java.io.File;
10+
import java.io.InputStream;
811
import java.util.Date;
912

1013
/**
@@ -110,4 +113,36 @@ public static File getPathByCheckFileName(File file) {
110113
}
111114
return file;
112115
}
116+
117+
/**
118+
* @param bytes 待检测编码bytes
119+
* @return 字符串编码
120+
*/
121+
public static String detectFileCharset(byte[] bytes) throws Exception {
122+
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
123+
return detectFileCharset(byteArrayInputStream, 51200);
124+
}
125+
126+
/**
127+
* @param inputStream 输入流
128+
* @param detectLength 检测长度
129+
* @return 字符串编码
130+
*/
131+
public static String detectFileCharset(InputStream inputStream, int detectLength) throws Exception {
132+
String charset;
133+
byte[] buf = new byte[detectLength];
134+
UniversalDetector detector = new UniversalDetector(null);
135+
int nread;
136+
while ((nread = inputStream.read(buf)) > 0 && !detector.isDone()) {
137+
detector.handleData(buf, 0, nread);
138+
}
139+
detector.handleData(buf, 0, buf.length);
140+
detector.dataEnd();
141+
charset = detector.getDetectedCharset();
142+
detector.reset();
143+
if (inputStream != null) {
144+
inputStream.close();
145+
}
146+
return charset;
147+
}
113148
}

0 commit comments

Comments
 (0)