当我尝试在 Batik 转码中使用从 SQL 表中检索到的 SVG 代码时,出现错误“3 字节 UTF-8 序列的无效字节 2”。
由 jQuery 从 DOM 中提取的 svg 绘图,并通过 jQuery Ajax 发送到 cfc,在那里它被更新为 SQL 表。在另一个单独的页面上,从表中查询了 SVG 代码,我尝试使用 Batik 将其转码为 PNG 文件。那时我收到了 Invalid UTF-8 Sequence 错误。
保存数据的代码:
var lclSVG = $('#holderDiv')[0].innerHTML;
$.ajax({
type: "POST",
url: "dbNIS.cfc?method=saveSketch",
data: ({orderID: ordID, sketch_svg: lclSVG}),
dataType: "json",
success: function(saveData) {alert(saveData.CODE);}
});
来自 CFC 的代码,其中 SVG 代码保存到表中:
<cffunction name="saveSketch" access="remote" output="no" returntype="struct" returnFormat="JSON">
<cfargument name="orderID" type="string" default="" required="Yes" hint="Order ID">
<cfargument name="sketch_svg" type="string" default="" required="Yes" hint="Sketch SVG Data">
<CFQUERY NAME="updateSketch">
UPDATE sketch
SET sketch_svg = '#arguments.sketch_svg#'
WHERE ordID = #arguments.orderID#
</CFQUERY>
</cffunction>
从表中检索 SVG 并用于转码为 PNG 的代码:
<CFQUERY NAME="getSketch">
SELECT sketch_svg AS svg
FROM sketch
WHERE ordID = 1
</CFQUERY>
<cfscript>
transcoder = createObject("java", "org.apache.batik.transcoder.image.PNGTranscoder").init();
inputStream = createObject("java", "java.io.StringBufferInputStream").init(getSketch.svg);
input = createObject("java", "org.apache.batik.transcoder.TranscoderInput").init(inputStream);
OutFile = expandPath("myTest.png");
outputStream=CreateObject("java", "java.io.FileOutputStream").init(OutFile);
output=CreateObject("java", "org.apache.batik.transcoder.TranscoderOutput").init(outputStream);
transcoder.transcode(input, output);
outputStream.close();
</cfscript>
注意:相反,我尝试将 svg 发送到操作页面,在该操作页面中将其更新到表中,立即从该表中检索它,然后对其进行转码,这样可以正常工作。所以在我看来,在通过 ajax 发送或从表中更新/检索时,我必须对字符集做错了什么。如果可以的话请帮忙...
我已经把它缩小了一些。当我将 svg 直接输入到表中时,第三部分工作正常......所以它一定是在 ajax 调用中发送数据的方式有问题,其中 svg 被发送到 cfc 以存储在表中.