.NET C#从UTF 16 LE转换为UTF 16 BE失败

时间:2015-10-23 13:55:49

标签: c# unicode encoding utf-16

我试图将一些字符串从UTF 16 LE转换为UTF 16 BE,但它无法编码第二个中文字符。

示例字符串:test馨俞

代码:

byte[] bytes = Encoding.Unicode.GetBytes(sendMsg.Text);
sendMsg.Text = Encoding.BigEndianUnicode.GetString(bytes)

我也试过

var encode = new UnicodeEncoding(false, true, true);
var messageAsBytes = encode.GetBytes(sendMsg.Text);
var enc = new UnicodeEncoding(true, true, true);
sendMsg.Text = enc.GetString(messageAsBytes);

导致以下错误:无法将索引184处的字节[DE] [4F]从指定代码页转换为行上的Unicode:

sendMsg.Text = enc.GetString(messageAsBytes);

感谢。

3 个答案:

答案 0 :(得分:1)

编码字符串的结果是字节数组,而不是另一个字符串。

只需使用

string toSend = Encoding.Default.GetString(bytes);

使用UTF 16 BE编码将字符串编码为字节。

然后将这些字节发送到大型机。

如何将这些字节发送到大型机可能是另一个问题的主题,但听起来您需要以字符串类型的变量呈现这些编码字节。这听起来像你正在使用的库中的一个错误。我们需要了解该库的性质及其可能的错误,以找到解决方法。你可以试试的一个选择,但它是黑暗中的一个镜头,是:

public class Alarm extends Service {
private String userName;
private String password;
private String receivingHost;
Context context;

public int onStartCommand(Intent intent, int flags, int startId) {
    final Handler handler = new Handler();
    TimerTask doAsynchronousTask = new TimerTask() {
        @Override
        public void run() {
        handler.post(new Runnable() {
                public void run() {
                    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                    StrictMode.setThreadPolicy(policy);
                     String senderPassword=new String("password");
                        String senderUserName=new String("username@gmail.com");
                        Alarm newGmailClient=new Alarm();
                        newGmailClient.setAccountDetails(senderUserName, senderPassword);
                        newGmailClient.readGmail();
                }
            });
        }
    };
    Timer timer = new Timer();
    timer.schedule(doAsynchronousTask, 10, 120000);

     return super.onStartCommand(intent, flags, startId);


  };



public void setAccountDetails(String userName,String password){  
    this.userName=userName;//sender's email can also use as User Name
    this.password=password;
}


public void readGmail(){
    this.receivingHost="imap.gmail.com";//for imap protocol
    Properties props2=System.getProperties();
    props2.setProperty("mail.store.protocol", "imaps");
    Session session2=Session.getInstance(props2, null);
        try {
                Store store=session2.getStore("imaps");
                store.connect(this.receivingHost,this.userName, this.password);
                Folder folder=store.getFolder("INBOX");//get inbox
                folder.open(Folder.READ_ONLY);//open folder only to read
                Message message[]=folder.getMessages();
                String key= "Hey";
                String subject;
                for(int i=0;i<message.length;i++){
                    System.out.println(message[i].getSubject());
                    subject=message[i].getSubject();

                 if(subject.equals(key)){
                     System.out.println("inside");
Intent mTutorial = new Intent(Alarm.this, LaunchActivity.class); 

this.startService(mTutorial); 

//I want to call service class in here. LaunchActivity is my service class.



                 }
                    //Log.d(message[i].getSubject(),message[i].getSubject());
                }
                folder.close(true);
                store.close();
        } catch (Exception e) {
               System.out.println(e.toString());
        }
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}
public void onDestroy() {


    // TODO Auto-generated method stub
    super.onDestroy();
    Log.d("", "FirstService destroyed");
}


}

这将产生一个字符串,其中每个字符是编码字符串中一个字节的表示,格式为UTF 16 BE。它的长度将是原始字符串长度的两倍。

答案 1 :(得分:1)

我认为您应该使用BigEndianUnicode类处理输入字符串。

我从您提供的代码中创建了此代码。它工作正常,没有错误:

Dim Myrange As Range

Sheets("Sheet 1").Activate

Set Myrange = ActiveSheet.Range("FF2:FF" & Cells(Rows.Count, "FF").End(xlUp).Row)
With Myrange
    .Offset(, -43).Value = .Worksheet.Evaluate("INDEX(SUBSTITUTE(TRIM(RIGHT(SUBSTITUTE(" & .Address & _
                                            ",""("",REPT("" "",500)),500)),"")"",""""),)")
End With

如果我处理&#34;输入&#34;使用Encoding.Unicode,并打印出两个字节数组(使用unicode处理的字节数组和使用big endian处理的字节数组),它显示了差异:

enter image description here

因此,输入将转换为您需要的字节序。

答案 2 :(得分:0)

我通过设置此属性而没有任何转换来实现它。

sendMsg.SetIntProperty(XMSC.JMS_IBM_CHARACTER_SET, 1201);