我正在使用 Magento 1.7 和他们的 SOAP api 来检索我的 .Net 环境的订单。除了字符编码,一切都很好。Å、Ä 和 Ö 等字符被翻译为 ??。
Fiddler 的响应显示服务器 (Litespeed) 实际上以 UTF-8 发送正确的字符。MySql 数据库也是用 UTF-8 编码的。
提琴手原料:
<city xsi:type="xsd:string">Å Ä Ö</city>
关于如何强制我的 c# 客户端不将其呈现为的任何想法??? ???..?
我正在使用 Magento 1.7 和他们的 SOAP api 来检索我的 .Net 环境的订单。除了字符编码,一切都很好。Å、Ä 和 Ö 等字符被翻译为 ??。
Fiddler 的响应显示服务器 (Litespeed) 实际上以 UTF-8 发送正确的字符。MySql 数据库也是用 UTF-8 编码的。
提琴手原料:
<city xsi:type="xsd:string">Å Ä Ö</city>
关于如何强制我的 c# 客户端不将其呈现为的任何想法??? ???..?
尝试指定 CultureInfo:http: //msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.71%29.aspx
我完全发疯了,并以可能最糟糕的方式解决了它,但它确实帮助我完成了我的任务,因为在 webclient 上设置cultureinfo 或设置 requestencoding 没有帮助:自定义 SoapExtension:
Public Class MySoapExtension
Inherits SoapExtension
Private oldStream As Stream
Private newStream As Stream
Public Overrides Function ChainStream(stream As Stream) As Stream
oldStream = stream
newStream = New MemoryStream()
Return newStream
End Function
Public Overloads Overrides Function GetInitializer(methodInfo As _
LogicalMethodInfo, _
attribute As SoapExtensionAttribute) As Object
End Function
Public Overloads Overrides Function GetInitializer(WebServiceType As _
Type) As Object
End Function
Public Overrides Sub Initialize(initializer As Object)
End Sub
Public Overrides Sub ProcessMessage(message As SoapMessage)
Select Case message.Stage
Case SoapMessageStage.BeforeSerialize
Case SoapMessageStage.AfterSerialize
WriteOutput(message)
Case SoapMessageStage.BeforeDeserialize
WriteInput(message)
Case SoapMessageStage.AfterDeserialize
Case Else
Throw New Exception("invalid stage")
End Select
End Sub
' Write the SOAP message out to a file.
Public Sub WriteOutput(message As SoapMessage)
newStream.Position = 0
Copy(newStream, oldStream)
End Sub
' Write the SOAP message out to a file.
Public Sub WriteInput(message As SoapMessage)
Copy(oldStream, newStream)
newStream.Position = 0
End Sub
Sub Copy(fromStream As Stream, toStream As Stream)
Dim reader As New StreamReader(fromStream)
Dim writer As New StreamWriter(toStream)
writer.WriteLine(ReplaceInvalidChars(reader.ReadToEnd()))
writer.Flush()
End Sub
Private Function ReplaceInvalidChars(ByVal content As String) As String
If content.Contains("salesOrderInfo") Then
Return MagentoHackHelper.Encode(content)
Else
Return content
End If
End Function
End Class
Public Class MagentoHackHelper
Public Shared Function Encode(content As String) As String
content = content.Replace("Å", "##Aaring##")
content = content.Replace("Ä", "##Auml##")
content = content.Replace("Ö", "##Ouml##")
content = content.Replace("å", "##aaring##")
content = content.Replace("ä", "##auml##")
content = content.Replace("ö", "##ouml##")
Return content
End Function
Public Shared Function Decode(content As String) As String
content = content.Replace("##Aaring##", "Å")
content = content.Replace("##Auml##", "Ä")
content = content.Replace("##Ouml##", "Ö")
content = content.Replace("##aaring##", "Å")
content = content.Replace("##auml##", "Ä")
content = content.Replace("##ouml##", "Ö")
Return content
End Function
End Class