我试图将一些字符串从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);
感谢。
答案 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处理的字节数组),它显示了差异:
因此,输入将转换为您需要的字节序。
答案 2 :(得分:0)
我通过设置此属性而没有任何转换来实现它。
sendMsg.SetIntProperty(XMSC.JMS_IBM_CHARACTER_SET, 1201);