【问题标题】:Problem encoding string to ISO8859-1将字符串编码为 ISO8859-1 时出现问题
【发布时间】:2011-01-18 09:19:58
【问题描述】:

我正在使用此代码将字符串转换为 ISO8859-1

baseurl = "http://myurl.com/mypage.php"
                client = New WebClient
                client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)")
                client.QueryString.Add("usuario", user)
                client.QueryString.Add("password", pass)
                client.QueryString.Add("ruta", 2)
                client.QueryString.Add("remitente", Me.txtRemite.Text)
                If Me.chkPRefijo.Checked = True Then
                    client.QueryString.Add("destinatarios", Me.LookUpEdit1.EditValue & Me.dtsMvl.Tables(0).Rows(x).Item("movil"))
                Else
                    client.QueryString.Add("destinatarios", Me.dtsMvl.Tables(0).Rows(x).Item("movil"))
                End If
                textoSms = Me.mmTexto.Text
                textoSms = System.Web.HttpUtility.UrlEncode(textoSms, System.Text.Encoding.GetEncoding("ISO-8859-1"))
                client.QueryString.Add("mensaje", textoSms)
                client.QueryString.Add("reporte", 1)
                data = client.OpenRead(baseurl)
                reader = New StreamReader(data)
                s = reader.ReadToEnd()
                data.Close()
                reader.Close()

但问题是当用户写这个字符时:+


示例:

用户在我的应用中写道:

价格80+增值税

我的应用程序中的编码字符串,这个字符串被发送到提供者:

价格+80%2bVAT

手机收到短信:

价格 80 增值税


编辑

需要向 URL 传递一些变量。因为我有一个发送短信的程序,而且我需要将变量发送到 URL(URL 提供商短信系统)。用户在我的程序中编写的字符串(message mobile)必须经过编码(ISO 8859-1)发送。

例如,PHP 中的这段代码运行良好:

$texto=urlencode($textoOriginal);

此代码返回转换后的字符串:

价格+80%2BVAT


编辑 2

我认为我的代码是错误的。因为如果我发送编码为“price+80%2BVAT”的相同字符串,为什么在 VB.NET 代码中无法运行而在 PHP 中运行良好?是相同的编码字符串。

【问题讨论】:

  • 这是 UrlEncode 的默认行为

标签: .net vb.net encoding character-encoding iso-8859-1


【解决方案1】:

这是 URL 编码的一部分 - + 表示 URL 中的空格。

换句话说,如果您实际上想要 URL 编码,这是正确的行为。如果您不这样做,请准确说明您要执行的操作。

【讨论】:

    【解决方案2】:

    我看到您正在将字符串传递给查询字符串,所以这是您要使用的方法。

    当你请求返回查询字符串时你需要做的是使用System.Web.HttpUtility.UrlDecode

    基本上你会做以下事情

    1. UrlEncode 原文
    2. 将其传递给 QueryString
    3. 请求查询字符串
    4. UrlDecode 获取原始文本。

    这是我运行的一个似乎有效的测试。

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim str As String = "This is My STRING with a + symbol."
        Dim encoded As String = Server.UrlEncode(str)
        Dim decoded As String = Server.UrlDecode(encoded)
    
        Dim sb As New StringBuilder
        sb.Append("Original String: ")
        sb.Append(str)
        sb.Append("</br>")
        sb.Append("Encoded String: ")
        sb.Append(Replace(encoded, "%2b", "%2B"))
        sb.Append("</br>")
        sb.Append("Decoded String: ")
        sb.Append(decoded)
    
        Response.Write(sb.ToString)
    End Sub
    

    这是我的结果

    原始字符串:这是我的带有 + 符号的字符串。
    编码字符串:this+is+My+STRING+with+a+%2B+symbol。
    解码字符串:这是带有 + 符号的我的字符串。

    编辑:
    看到你的编辑后,试试下面这个...

    textoSms = Replace(System.Web.HttpUtility.UrlEncode(Me.mmTexto.Text, System.Text.Encoding.GetEncoding("ISO-8859-1")), "%2b", "%2B")
    

    而不是使用你在这里的东西......

        textoSms = Me.mmTexto.Text
        textoSms = System.Web.HttpUtility.UrlEncode(textoSms, System.Text.Encoding.GetEncoding("ISO-8859-1"))
    

    【讨论】:

    • 我只需将编码的文本发送到我的短信供应商的系统。
    • 所以他们没有适当地解密它吗?也许问他们他们希望你如何发送“+”符号。
    • 这是一个很长的镜头,但是您是否尝试在没有 ISO 指定器的情况下发送编码命令? System.Web.HttpUtility.UrlEncode(smsMessage)
    • 如果我在未指定 ISO 的情况下发送,则消息接收不正确。但是如果我指定 ISO 8859-1,除了这个字符 +
    • 短信供应商只对我说,短信必须按照ISO8859 1进行编码。例如,在PHP中如果你这样做:“$mensaje=urlencode($mensaje);”它运行良好(不是特别编码字符+)。但我仍然没有设法在 VB.NET 中编写代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2012-05-16
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 2021-12-05
    • 2012-12-02
    相关资源
    最近更新 更多