2011-08-01 85 views
12

Tôi đã quan sát vấn đề này trong nhiều năm nay, không biết nó đến từ đâu. Tôi lo ngại rằng lỗi này vẫn có thể quan sát được trong các phiên bản Android mới, vào năm 2011 và tôi hy vọng bạn cuối cùng có thể giúp tôi hiểu đầy đủ, nếu không giải quyết được.Ký tự đặc biệt trong Android sms

Hãy xem xét tình huống (thực) đã cho. Mister "A" đang sử dụng ứng dụng SMS/MMS tùy chỉnh từ Sony trên Xperia Arc (chính thức 2.3.3). Mister B đang sử dụng ứng dụng ngăn xếp SMS/MMS Android trên Milestone của anh ấy (Cyanogen 6.12, không chính thức 2.2). Cả hai đều sử dụng Android bằng tiếng Pháp (nếu có).

Khi A gửi một tin nhắn tới B chứa các ký tự đặc biệt như "ç", "ê", B sẽ nhận được một tin nhắn với các ký tự này được thay thế bằng dấu cách. Nhân vật như "é" đang làm việc tốt mặc dù. Khi B gửi sms đến A, mọi thứ hoạt động tốt. Khi A gửi sms này cho chính mình, mọi thứ hoạt động tốt.

Kết luận: đây không phải lỗi của nhà cung cấp dịch vụ di động vì nó hoạt động theo cách này chứ không phải cách khác.

Vì vậy, tôi đoán lúc đầu rằng có sự cố với ứng dụng tùy chỉnh của A. Thay thế nó bằng apk từ điện thoại của B. Mọi thứ vẫn như cũ. Tôi giải mã các ứng dụng và tôi đã không tìm thấy nơi mã hóa của chuỗi sms đã được thực hiện. Tôi đã kết luận lỗi này không xuất phát từ ứng dụng, nhưng từ cách Android mã hóa các chuỗi ...

Tôi đã chạy một thử nghiệm khác: Tôi đã viết một tin nhắn chỉ với các ký tự chuẩn, khoảng 250 ký tự trong 1,5 sms. Sau đó, tôi nối thêm "ç" vào sms. Trên điện thoại của A: bộ đếm cho biết nó tiêu thụ 10 ký tự. Trên điện thoại của B: bộ đếm cho biết tin nhắn hiện có 3 tin nhắn: kích thước chuỗi tăng gấp đôi!

Kết luận: Trên điện thoại của A, bộ ký tự mặc định bao gồm "ç". Trên điện thoại của B, khi "ç" xuất hiện, bộ ký tự thay đổi và mỗi ký tự cần gấp hai lần không gian ban đầu. (Hoặc tôi thiếu điều gì đó?)

Câu hỏi: Tại sao phiên bản Android khác không sử dụng cùng bộ ký tự mặc định? Trên Android, các bộ ký tự mặc định này có phụ thuộc vào rom không? Chúng tôi có thể định cấu hình/thay đổi các bộ ký tự này ở đâu đó (trong menu hoặc trực tiếp trên điện thoại bắt nguồn) không? Có cách nào khác dễ dàng để sửa lỗi này không?

Bất kỳ trợ giúp, giải thích hoặc trải nghiệm nào đều được chào đón :)

Trả lời

3

Bạn đang gặp sự cố mã hóa. Từ mô tả, có vẻ như 'A' đang gửi dữ liệu trong một bộ ký tự và không bao gồm thông tin về bộ ký tự là gì. Nguyên nhân chính là để truyền các ký tự mở rộng (không phải ascii) giữa hai hệ thống mà chúng phải đồng ý trên một mã hóa để sử dụng. Nếu bạn bị giới hạn ở các giá trị 8 bit thì hệ thống đồng ý sử dụng cùng một mã. Trong tin nhắn SMS có một bảng mã GSM đặc biệt cho 7 hoặc 8 bit mã hóa hoặc UTF-16 có thể được sử dụng trong đó sử dụng 2 byte để đại diện cho mỗi nhân vật. Những gì bạn thấy khi bạn nhập 250 ký tự theo sau là một ký tự mở rộng duy nhất cho bạn thấy những gì đang xảy ra trong ứng dụng. Tin nhắn SMS bị giới hạn ở 140 octet. Khi bạn đang sử dụng mã hóa 8 bit, 250 ký tự của bạn phù hợp với 2 thư (250 < 280) tuy nhiên khi bạn đã thêm "ç", ứng dụng đã thay đổi để sử dụng mã hóa UTF-16 vì vậy đột nhiên tất cả ký tự của bạn đang dùng 2 octet và bạn chỉ có thể phù hợp với 70 ký tự thành một tin nhắn. Bây giờ phải mất 3,5 tin nhắn SMS để chuyển toàn bộ tin nhắn.

Trên Android, việc giải mã tin nhắn SMS là một phần của mã điện thoại khuôn khổ trong SmsCbMessage.java. Nó làm việc ra mã ngôn ngữ và mã hóa của nội dung thư.Nếu điều này không chính xác (tin nhắn được mã hóa bằng một bảng mã tiếng Anh nhưng sử dụng các ký tự mở rộng của Pháp) thì bạn có thể nhận được các ký tự lẻ xuất hiện.

Bạn nói đúng rằng đây không phải là mạng di động do lỗi. Tôi nghi ngờ nó là ứng dụng nhắn tin của điện thoại A mặc dù có thể là Android không xác định chính xác mã hóa của một tin nhắn SMS hợp lệ. Tôi tự hỏi làm thế nào nó hoạt động giữa A và iPhone hoặc một số thiết bị nhà sản xuất khác.

+0

Cảm ơn câu trả lời của bạn. Chúng tôi đã chạy thử nghiệm với các điện thoại khác, cùng một kết quả khi A gửi một tin nhắn có các ký tự đặc biệt. Vì vậy, tôi đoán có một vấn đề khi A được mã hóa sms. Bạn có chắc điều này được thực hiện trong ứng dụng SMS/MMS chứ không phải trong nội bộ khung Android? Làm thế nào chúng ta có thể sau đó giải thích thực tế là việc thay đổi các ứng dụng trên điện thoại của A cho các ứng dụng đến từ điện thoại của B đã không cố định vấn đề? – Romain360

+0

Vì đây là cả hai thiết bị Android, bạn thực sự có thể kiểm tra tin nhắn SMS khi nó đi qua lớp radio sau khi nó được mã hóa. Nếu bạn sử dụng 'adb logcat -b radio | tee radio.log 'và sau đó gửi tin nhắn thử nghiệm của bạn, bạn sẽ thấy một cái gì đó như sau: – patthoyts

+0

E/RIL (133): smsc: E/RIL (133): strlen (pdu) = 114 (0x39), pdu: 01000c91449732832356000b2c005400650073007400 200065006e0063006f00640069006e0067002000e700200061006e0064002000e9002e Đây là phiên bản được mã hóa utf-16 của 'Mã hóa kiểm tra ç và é'. với một số byte tiêu đề ở phía trước. Chúng ta có thể kiểm tra điều này bằng cách sử dụng python >>> x [26:]. Giải mã ('hex') giải mã ('utf-16be') mã hóa u'Test \ xe7 và \ xe9. ' Vì vậy, với điều này bạn có thể kiểm tra đầu ra cho các lớp radio mà nên hiển thị nó đã được mã hóa sai trước khi nó rời khỏi điện thoại. – patthoyts

0

Tôi đã gặp phải vấn đề tương tự khi tôi phải hiển thị một vài ký tự đặc biệt trong ứng dụng unicode sms. Phương pháp tôi sử dụng là lấy chuỗi mà tôi cần gửi dưới dạng sms, chạy nó trong vòng lặp for để lấy từng ký tự, tìm mã ascii của nó, sử dụng giá trị số nguyên đó để mã hóa chuỗi đó bằng dấu phân tách. Chuỗi này có thể được gửi dưới dạng tin nhắn, cần được giải mã bằng cách sử dụng cùng một dấu phân cách được sử dụng để gửi, sau đó chuyển đổi từng mã ascii char thành ký tự (ngôn ngữ cụ thể), tạo thành chuỗi bằng cách gắn các ký tự được chuyển đổi. Văn bản này sẽ giống với văn bản được gửi dưới dạng tin nhắn.

Kính trọng