android - 使用 ADB 发送消息的编码问题

标签 android encoding adb

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

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

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

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

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

我如何让它发挥得更好,这样我至少可以利用变音符号?

所有这些在 Linux 中都运行良好。

最佳答案

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

如果您使用例如 C#,则必须按照以下示例进行操作:

02.12.2019

根据protocol.txt , ADB-Protocol 支持“智能套接字”。这些套接字可以用来做所有的事情,adb.exe 中的 ADB-Client 可以。例如,如果你想上传一个文件,你必须请求这样一个“智能 socket ”。之后,您必须遵循分配给服务的协议(protocol)(有关服务概述,请参阅 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 编写的。

问候, 塞巴斯蒂安

关于android - 使用 ADB 发送消息的编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11038725/

相关文章:

android - Live Data Observer 只调用了一次。当再次调用 api 更新 UI 时,它不会从服务器更新数据

android - 无法启动 Genymotion 虚拟设备 - Virtualbox Host Only 以太网适配器无法启动

scala - 在 Scala 中读写文本,编码正确吗?

php - 在不转换字符的情况下将 linux 文件更改为编码类型 utf 8

android - Eclipse 无法识别 Android 设备

Android Studio 调试器单步执行旧版本代码,不是最新的

java - 在对话框中动态添加 View

java - android从类似于用于字符串的方法的微调器中获取一个整数

php - 未在 html 文档中声明的字符编码

android - 即使启用了 USB 调试,ADB 也检测不到我的设备