我正在尝试使用VBA中的WinHttpRequest从我的在线mySQL服务器读取数据。
Dim objHTTP As New WinHttp.WinHttpRequest
With objHTTP
.Open "POST", "http://www.dname.com/ruski/php/getNewestPID.php", True
.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=""UTF-8"""
.Send "PID=" & lngPID
.WaitForResponse
Debug.Print .ResponseText
End With
<?php
$PID = $_POST['PID'];
require_once ('config.php');
if(!$PID>0){
die("##### Error: getNewestPID failed - PID='" . $PID . "' #####");
}
$phrases = mysql_query("SELECT * FROM phrases WHERE (PID > '$PID')");
if(!$phrases){
die("##### Error: getNewestPID SELECT failed - PID=" . $PID . " - " . mysql_error() . " #####");
}
mysql_close($db);
echo "data=";
while($row = mysql_fetch_array($phrases)) {
echo $row[0] . "|" . $row[1] . "|" . $row[2] . "|" . $row[3];
}
?>
一切正常,但西里尔文本的返回方式如下:
data = 21361 | 105 ||Ð?алÑ?Ñ?икигÑ?аÐμÑ? наÑкÑ?ипкÐμвÑвоÐμйкомнаÑ?Ð
我的数据库使用UTF-8 Unicode。我知道西里尔语在表格和表格中有效,但在VB编辑器中查看了垃圾。
我试过了:
Set FileStream = CreateObject("ADODB.Stream")
FileStream.Open
FileStream.Type = 1 'Binary
FileStream.Write objHTTP.ResponseBody
FileStream.Position = 0
FileStream.Type = 2 'adTypeText
FileStream.Charset = "Windows-1251" ' https://msdn.microsoft.com/en-us/library/ms526296(v=exchg.10).aspx
strText = FileStream.ReadText
FileStream.Close
以记录中的垃圾结束:
МальчикиграРμС,наскрипкРμРІСЃРІРѕРμР№РєРѕРјРЅР°СоРμ。
最好的结果是:
mb_convert_encoding($ row [3],“Windows-1251”,“UTF-8”)
Ìàëü÷èêèãðàåòíàñêðèïêåââñåîåéêîìíàòå。
答案 0 :(得分:0)
这不是很优雅,但是当我遇到类似问题时,它对我有用。它只是一个将从1251手动转换为Unicode的函数。该代码适用于俄语和乌克兰语,但是根据您使用的语言,可能会有不同的字符,因此您需要将其添加到if语句中。如果找不到所需的字符,也可以考虑添加else,如果引发问号,则添加其他字符。
Public Function AsciitoUni(base_cell As String) As String
AsciitoUni = ""
For i = 1 To Len(base_cell)
Dim s As String
Dim u As Integer
Dim a As Integer
s = Mid(base_cell, i, 1)
a = Asc(s)
If (a <= 127) Then
u = a
ElseIf (a >= 192) And (a <= 255) Then
u = a + 848
ElseIf (a = 184) Then
u = 1105
ElseIf (a = 186) Then
u = 1108
ElseIf (a = 179) Then
u = 1110
ElseIf (a = 191) Then
u = 1111
ElseIf (a = 168) Then
u = 1025
ElseIf (a = 170) Then
u = 1028
ElseIf (a = 178) Then
u = 1030
ElseIf (a = 175) Then
u = 1031
ElseIf (a = 185) Then
u = 8470
End If
AsciitoUni = AsciitoUni & ChrW(u)
Next
End Function