1

我已经实现了一个服务来监听通过 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 中都可以正常工作。

4

2 回答 2

2

我遇到了同样的问题,但最后我得到了它的工作!

如果你使用例如 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 推/拉文件/文件夹的工作“框架”,还请查看我的 AndroidCtrl.dll,它是 C# .NET4 编写的。

问候,塞巴斯蒂安

于 2014-10-13T23:02:47.257 回答
0

最后,问题出在 cmd.exe 或 adb.exe 中。直到其中一个或两个都更新为更加兼容,我将暂时无法使用它。

于 2012-12-03T20:37:04.433 回答