【问题标题】:Encoding issues using ADB to dispatch messages使用 ADB 发送消息的编码问题
【发布时间】:2012-06-14 17:58:34
【问题描述】:

我已经实现了一个服务来监听通过 ADB 发出的命令。通过 ADB 发送的命令示例如下所示:

adb shell am startservice -a com.testandroid.SEND_SMS -e number 123123123 -e message "åäö"

现在,这里的问题是字符串“åäö”的编码似乎搞砸了。如果我将该字符串附加并立即将其输出到日志中,我会得到一个正方形“[]”,未知字符。如果我发送此消息,我会在消息应用程序中获得中文字符。只要我坚持使用非元音变字符(我猜是 ASCII),一切正常。

我正在使用 Windows 7 和命令行。我没有触及命令行的编码,我试图通过获取字节字符来处理额外的字符串,将 UTF-8 作为编码参数传入,然后创建一个新的字符串传入 UTF-8 作为编码参数也有。不过没有骰子。

使用 getBytes() 时字节的值是 å: -27, ä: -92, ö: -74

我怎样才能让它演奏得很好,以便我至少可以使用变音符号?

所有这些都可以在 Linux 中完美运行。

【问题讨论】:

  • 嗯,cmd.exe 和 PowerShell 在编码方面存在问题,尤其是在传递命令时,例如:“adb shell am startservice -a nu.app.DO_MESSAGE -e ints 123 -e message 'åäöÅÄÖ'",因为不可能让这个字符串正确显示。我已将其范围缩小到 cmd.exe 发出 adb-command 之间的某个位置,adb-command 又将命令传递给我设备上的 shell。当我通过键入“adb shell”“手动”传递字符串时,打开 shell 命令提示符,然后发出“am startservice...”命令,一切正常。
  • 您是否测试过将代码页更改为 UTF-8 后是否有效? stackoverflow.com/questions/388490/…
  • 是的,我有。我已经尝试了几个不同的代码页,看看是否有任何效果,唉,什么都没有。它一直给我同样的不可读的字符。当我输入“åäöÅÄÖ”时,shell 似乎会将其中一些字符转换为控制代码,因为我得到的输出是“夶ńր_=/system/bin/app_process”,这是错误的。跨度>

标签: android encoding adb


【解决方案1】:

我遇到了同样的问题,但我终于成功了!

如果你使用例如 C#,你必须像下面的例子那样做:

02.12.2019

根据protocol.txt,ADB-Protocol 支持“智能套接字”。这些套接字可用于完成所有工作,adb.exe 中的 ADB-Client 可以。例如,如果要上传文件,则必须请求这样的“智能套接字”。之后,您必须遵循分配给服务的协议(有关服务概述,请参阅SERVICE.txt,如SYNC.txt 中所述。

13.10.2014

public static List<string> ExecuteBG(string exe, string args, int timeOut = -1)
{
    if (File.Exists(exe) || exe == "cmd.exe")
    {
        ProcessStartInfo StartInfo = new ProcessStartInfo();
        StartInfo.FileName = exe;
        StartInfo.Arguments = Encoding.Default.GetString(Encoding.UTF8.GetBytes(args));
        StartInfo.CreateNoWindow = true;
        StartInfo.UseShellExecute = false;
        StartInfo.RedirectStandardError = true;
        StartInfo.RedirectStandardOutput = true;
        StartInfo.StandardErrorEncoding = Encoding.UTF8;
        StartInfo.StandardOutputEncoding = Encoding.UTF8;
        AutoResetEvent errorWaitHandle = new AutoResetEvent(false);
        AutoResetEvent outputWaitHandle = new AutoResetEvent(false);
        List<string> response = new List<string>();

        Process proc = new Process();
        proc.StartInfo = StartInfo;
        proc.ErrorDataReceived += (s, e) =>
        {
            if (String.IsNullOrEmpty(e.Data))
            {
                errorWaitHandle.Set();
            }
            else
            {
                response.Add(e.Data);
            }
        };
        proc.OutputDataReceived += (s, e) =>
        {
            if (String.IsNullOrEmpty(e.Data))
            {
                outputWaitHandle.Set();
            }
            else
            {
                response.Add(e.Data);
            }
        };
        proc.Start();
        proc.BeginErrorReadLine();
        proc.BeginOutputReadLine();
        proc.WaitForExit(timeOut);
        errorWaitHandle.WaitOne(timeOut);
        outputWaitHandle.WaitOne(timeOut);
        return response;
    }
    return new List<string>();
}

真正重要的是“StartInfo.Arguments = Encoding.Default.GetString(Encoding.UTF8.GetBytes(args));”这一部分,这里我们将UTF8字符串转换为cmd已知的Windows“默认”字符集。因此,我们向 cmd 发送一个“已销毁”“默认”编码字符串,Android shell 会将其转换回 UTF8。所以我们有像“üöäÜÖÄàè 等”这样的“变音符号”。

希望这对某人有所帮助。

PS:如果您需要一个支持 UTF8 推/拉文件/文件夹的工作“框架”,还请查看my AndroidCtrl.dll,它是用 C# .NET4 编写的。

问候, 塞巴斯蒂安

【讨论】:

    【解决方案2】:

    结论,问题出在 cmd.exe 或 adb.exe。遗憾的是,在其中一个或两个都更新为更加兼容之前,我暂时无法使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 2021-06-05
      • 1970-01-01
      • 2011-03-20
      • 2010-10-16
      • 2021-05-06
      相关资源
      最近更新 更多