PhantomJS无法识别的特殊/重音UTF-8字符

时间:2017-02-05 15:51:56

标签: unicode command-line utf-8 character-encoding phantomjs

我目前遇到PhantomJS(版本2.1.1 / Windows 7)无法识别UTF-8字符的问题。在提出这个问题之前,我发现以下两篇文章对配置命令提示符很有用:

正如第二篇文章所建议的,我使用了命令

Sub Update_Excel_from_Access_with_Recordset()
Dim sSQL As String
On Error GoTo ExceptionHandling

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.CursorLocation = adUseServer

'different options, tested OK
'cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ActiveWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;"";"
'cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ActiveWorkbook.FullName & ";Extended Properties=Excel 12.0 Xml;"
cn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & ActiveWorkbook.FullName & ";ReadOnly=0;"

'Create a recordset object
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

sSQL = "SELECT a1.Results As er, a2.Results As ar " _
  & "FROM [Sheet1$] a1 INNER JOIN [;Database=" & ThisWorkbook.Path & "\data.mdb].[Test] a2 " _
  & " ON a1.[ID] = a2.[ID]"

With rst
  .CursorLocation = adUseServer
  .CursorType = adOpenKeyset
  .LockType = adLockOptimistic
  .Open sSQL, cn
  If Not rst.EOF Then
    Do Until rst.EOF
      rst!er = rst!ar
      .Update
      .MoveNext
    Loop
    .Close
  Else
    .Close
  End If
End With

CleanUp:
 Cancelled = False
 On Error Resume Next
 cn.Close
 Set rst = Nothing
 Set cn = Nothing
 Exit Sub
ExceptionHandling:
  MsgBox "Error: " & Err.description
  Resume CleanUp
End Sub

将代码页更改为UTF-8。然后我还将命令提示符的默认字体设置为Lucida console。

为了测试这是否有效,我创建了以下UTF-8文本文件

chcp 65001

然后运行以下命令以演示是否正在通过命令提示符识别并正确显示字符:

---------------------------------------------------------
San José
Cañon City
Przecław Lanckoroński
François Gérard Hollande
El Niño
vis-à-vis
---------------------------------------------------------

UTF-8 accented recognised and correctly displayed by the command prompt

在此工作之后,我将注意力转向PhantomJS。按照here的说明创建了以下设置json文件,以确保UTF-8是输入和输出字符编码(尽管根据官方文档,这似乎是默认设置)。

type utf8Test.txt

然后我在同一命令提示符窗口中使用上述json设置文件通过PhantomJS运行以下JavaScript:

{
    "outputEncoding: "utf8",
    "scriptEncoding": "utf8"
} 

运行此脚本的输出如下所示:

UTF-8 accented characters not displayed by PhantomJS

由此我可以看出PhantomJS无法理解UTF-8特殊字符,而且它通过了"未知"如果提供了特殊或重音字符,则为网站提供字符,如下所示:

console.log("---------------------------------------------------------");

console.log("San José");
console.log("Cañon City");
console.log("Przecław Lanckoroński");
console.log("François Gérard Hollande");
console.log("El Niño");
console.log("vis-à-vis");

console.log("---------------------------------------------------------");

page = require('webpage').create();

// Display the initial requested URL
page.onResourceRequested = function(requestData, request) { 
    if(requestData.id === 1){
        console.log(requestData.url);
    }
};

// Display any initial requested URL response error
page.onResourceError = function(resourceError) {
    if(resourceError.id === 1){
        console.log(resourceError.status + " : " + resourceError.statusText);
    }
};

page.open("https://en.wikipedia.org/wiki/San_José", function(status) {
    console.log("---------------------------------------------------------");
    phantom.exit();
});

这会导致网站回复“错误请求”#39;错误,特别是在维基百科的情况下,请求URL https://en.wikipedia.org/wiki/San_Jos%EF%BF%BD会导致错误消息:

  

错误标题 - 请求的页面标题包含无效的UTF-8序列。

所以,有了这一切,有人知道如何解决这个问题吗?现在有很多网站在他们的页面网址中使用UTF-8特殊/重音字符,如果可以使用PhantomJS来访问它们会很棒。

我非常感谢您提供给我的任何帮助或建议。

1 个答案:

答案 0 :(得分:1)

var url = 'https://en.wikipedia.org/wiki/San_José';

page.open(encodeURI(url), function(status) {
    console.log("---------------------------------------------------------");
    console.log(page.evaluate(function(){ return document.title }));
    phantom.exit();
});

enter image description here

是的,它在Windows上乱用这些符号(在Linux上运行beautifully)但至少你可以打开页面并处理它们。