NiFi中ExecuteScript(Jython)非ASCII字符编码错误求助
解决NiFi ExecuteScript(Jython)处理非ASCII字符的编码错误
问题根源
Jython默认用ASCII编码处理字符串,而NiFi的FlowFile内容(比如GenerateFlowFile生成的文本)默认是UTF-8编码。如果读取或写入时不明确指定编码,就会触发ASCII编码无法处理非ASCII字符的错误。指定ISO_8859_1无效的原因大概率是FlowFile实际内容是UTF-8编码,用ISO_8859_1解码会导致字符损坏,后续写入时仍会触发编码问题。
解决方案:显式指定UTF-8编码读取和写入
以下是修正后的Jython代码,核心是在读取FlowFile内容和写入外部文件时都明确指定UTF-8编码,覆盖Jython的默认ASCII设置:
from org.apache.nifi.processor.io import StreamCallback from java.io import BufferedReader, InputStreamReader, FileWriter, BufferedWriter from java.nio.charset import StandardCharsets class AppendToFileCallback(StreamCallback): def __init__(self, output_path): self.output_path = output_path def process(self, input_stream, output_stream): # 用UTF-8编码读取FlowFile内容,避免默认ASCII解码错误 reader = BufferedReader(InputStreamReader(input_stream, StandardCharsets.UTF_8)) content_line = reader.readLine() while content_line is not None: # 写入文件时指定UTF-8编码,第三个参数为True表示追加模式 with BufferedWriter(FileWriter(self.output_path, True, StandardCharsets.UTF_8)) as writer: writer.write(content_line) writer.newLine() content_line = reader.readLine() # 替换为你的目标文件路径 target_file = "/opt/nifi/output/special_chars.txt" flow_file = session.get() if flow_file is not None: # 执行写入回调 flow_file = session.write(flow_file, AppendToFileCallback(target_file)) session.transfer(flow_file, REL_SUCCESS) session.commit()
关键注意事项
- 读取编码匹配FlowFile实际编码:GenerateFlowFile生成的文本默认是UTF-8,必须用对应编码读取;如果你的FlowFile是其他编码(比如ISO_8859_1),则替换为对应编码即可。
- 写入编码统一:写入外部文件时必须指定和读取一致的编码,避免字符转码损坏。
- 不要依赖Jython的隐式字符串转码,所有涉及字节流和字符串转换的步骤都要显式指定编码。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

