【问题标题】:JavaScript blob encoding as UTF-8 instead of ANSIJavaScript blob 编码为 UTF-8 而不是 ANSI
【发布时间】:2015-12-07 05:40:00
【问题描述】:

我使用 JavaScript blob 创建一个 FDF 文件,该文件打开并填充本地存储的 PDF。

但是,本地存储的 PDF 的文件路径包含重音字符(我无法编辑文件夹名称)。

当文件夹路径不包含重音符号并且我在记事本中打开 fdf 时,此代码有效,默认编码为 ANSI。但是,当文件夹路径包含重音符号时,FDF 会打开一条消息,指出无法找到 PDF。此外,记事本中的默认编码已更改为 UTF-8。

FDF_Text = ''
    + '%FDF-1.2' + "\n"
    + '1 0 obj<</FDF<</F(T:/Échange/MY_PDF.pdf)/Fields 2 0 R>>>>' + "\n"
    + 'endobj' + "\n"
    + '2 0 obj[' + "\n" 
    + '<</T(FIELD_NAME)/V(SOME_TEXT)>>' + "\n"
    + ']' + "\n" 
    + 'endobj' + "\n"
    + 'trailer' + "\n"
    + '<</Root 1 0 R>>' + "\n"
    + '%%EO'


var blobObject = new Blob([FDF_Text], {type: 'text/css;charset=ANSI'}); 
window.navigator.msSaveOrOpenBlob(blobObject, 'MY_FDF.fdf');

我试过了

  • 用 E 替换 É
  • 使用 String.fromCharCode(201)(É 的 chr 值)
  • 将 blob 本身的“类型”更改并删除为我发现的几个不同示例(抱歉,我没有跟踪所有不同的组合)。

谁能提出不同的解决方案?

【问题讨论】:

  • 该文件路径的工作 FDF 看起来如何(无论您如何构建/下载它)?
  • 看起来一模一样。我刚刚测试了 2 个相同的 FDF 文件,它们保存到我计算机上的一个文件夹中,文件路径中都带有“É”。在记事本中并排打开时,它们看起来相同,并且“É”字符没有损坏。唯一的区别是另存为一个显示 UTF-8 和另一个 ANSI 的编码。运行 UTF-8 版本会给出消息,说明找不到文件。运行 ANSI 版本可以完美运行。
  • charset=ANSI 是什么,有效吗? Which one 你的意思是?
  • 我不确定它是否有效。我在任何地方都找不到有效的 blob 第二个参数列表。我使用 ASCII、ISO/IEC 8859 和 Windows-1252 运行了一些测试,但没有运气。我不知道该参数究竟做了什么,因为我也尝试删除它以及输入乱码。没有不同。我采用的解决方案很糟糕,但很有效:New Blob 创建了一个 vbs(用户必须在打开时单击一个额外的安全警告),vbs 将 FDF 写入本地驱动器,然后执行它。 FDF 在本地写入时,会保存为记事本的默认编码。在这种情况下,即 ANSI。
  • Blob 类型似乎与 HTTP content-type 标头 (as documented) 匹配,因此您应该尝试其有效值(ISO-8859-1 似乎也很常见)。无论如何,我想您的问题实际上是您正在从“DOM 字符串”构建 Blob,该字符串本质上编码为 UTF-16,并以这种方式写入 Blob 的缓冲区。

标签: javascript encoding utf-8 blob ansi


【解决方案1】:

您可以将数据表示为二进制,只需遍历字符串并填充二进制数组

    FDF_Text = ''
        + '%FDF-1.2' + "\n"
        + '1 0 obj<</FDF<</F(T:/Échange/MY_PDF.pdf)/Fields 2 0 R>>>>' + "\n"
        + 'endobj' + "\n"
        + '2 0 obj[' + "\n" 
        + '<</T(FIELD_NAME)/V(SOME_TEXT)>>' + "\n"
        + ']' + "\n" 
        + 'endobj' + "\n"
        + 'trailer' + "\n"
        + '<</Root 1 0 R>>' + "\n"
        + '%%EO'
    
    var uint8 = new Uint8Array(FDF_Text.length);
    for (var i = 0; i <  uint8.length; i++){
        uint8[i] = FDF_Text.charCodeAt(i);
    }
    var blobObject = new Blob([uint8], {type: 'text/fdf'}); 
    window.navigator.msSaveOrOpenBlob(blobObject, 'MY_FDF.fdf');

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多