2012-06-14 3 views
0

Я реализовал службу, которая слушает команды, выданные через ADB. Пример команды, отправляемой через АБРЫ может выглядеть следующим образом:Проблемы с кодированием, использующие ADB для отправки сообщений

ADB оболочка утро StartService -a com.testandroid.SEND_SMS -e номер 123123123 -e сообщение "АОА"

Теперь, проблема вот что кодировка строки «åäö», кажется, испортит. Если я возьму эту строковую опцию и немедленно выведу ее в журнал, я получаю квадрат «[]», неизвестный символ. Если я отправлю это сообщение, я получаю китайские символы в приложении сообщений. Пока я придерживаюсь символов не-умлаута (ASCII, я думаю), все работает нормально.

Я использую Windows 7 и командную строку для этого. Я не коснулся кодировки командной строки, и я попытался обработать строку extras, получив байтовые символы, передав в UTF-8 как аргумент кодирования, а затем создав новую строку, проходящую в UTF-8, в качестве аргумента кодировки там также. Тем не менее, кубики.

Значения байтов, при использовании GetBytes() являются: -27, ä: -92, ö: -74

Как получить это играть хороший, так что я могу использовать, по меньшей мере, умлауты?

Все это отлично работает в Linux.

+0

Ну, cmd.exe и PowerShell излагают проблему, когда речь идет о кодировании, особенно когда речь идет о переходе команды, такие как: «ADB оболочка утра StartService -a nu.app.DO_MESSAGE -e ints 123 -e сообщение 'åäöÅÄÖ' ", потому что никоим образом невозможно получить эту строку, чтобы выйти правильно. Я сузил его до где-то между cmd.exe, выписывая команду adb, которая, в свою очередь, передает команду оболочке на моем устройстве. Когда я передаю строки «вручную», набрав «adb shell», который открывает командную строку оболочки, а затем выдает команду «am launchervice ...», все работает. –

+0

Вы протестировали, если он работает после перебора кодовой страницы в UTF-8? http://stackoverflow.com/questions/388490/unicode-characters-in-windows-command-line-how – Robert

+0

Да, у меня есть. Я пробовал несколько разных кодовых страниц, чтобы понять, не имеет ли это никакого эффекта, увы, ничего. Он продолжает давать мне такие же нечитаемые персонажи.Когда я набираю «åäöÅÄÖ», похоже, что оболочка переводит некоторые из этих символов для управления кодами, потому что я получаю вывод «å¤¶Å» Ö € _ =/system/bin/app_process », который просто неверен. –

ответ

0

В заключение, проблема находится в cmd.exe или adb.exe. Пока один или оба не будут обновлены, чтобы быть более совместимыми с eachother, я, к сожалению, пока не смогу использовать это.

1

Я столкнулся с тем же вопросом, но, наконец, я получил его!

если и использовать, например, C# и есть, чтобы сделать это, как в следующем примере:

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 (арг)); ", здесь мы преобразуем строку UTF8 в кодировку Windows по умолчанию, которая известна по команде cmd. Таким образом, мы отправляем «разрушенную» строку «по умолчанию» в cmd, и оболочка Android преобразует ее обратно в UTF8. Таким образом, у нас есть «умлауты», такие как «üöäÜÖÄàè и т. Д.».

Надеюсь, это поможет кому-то.

PS: Если вам нужна рабочая «Framework», которая поддерживает UTF8 push/pull для файлов/папок, также посмотрите на my AndroidCtrl.dll, это C# .NET4.

С уважением, Себастьян

Смежные вопросы