对于汉字‘啊’,它的区位码为‘1601’,机内码是“B0A1”。可是在MATLAB中键入汉字,却发现它的值不是机内码。比如:
>a='啊'
a =
啊
> a=a-0
a =
21834
>b=dec2hex(a)
b =
554A
这个值显然不是合理的机内码,那么如何在Matlab中得到汉字的机内码呢?
一、使用函数 mxArrayToString 将MATLAB的字符串转换为普通字符串时会将unicode代码转换为内码
利用mex函数可以取到内码,在使用函数 mxArrayToString
将MATLAB的字符串转换为普通字符串时会将unicode代码转换为内码,然后再将其输出就可以实现了。将代码存为
mexGetCode.cpp 然后用 mex mexGetCode.cpp 编译一下就可以用了。
[code]
#include "mex.h"
#include "string.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray
*prhs[])
{
if(nrhs != 1 ||
!mxIsChar(prhs[0]))
{
mexErrMsgTxt("Requires
one char array argument!");
}
if(nlhs >
1)
{
mexErrMsgTxt("Too
many output arguments!");
}
char *pStr =
mxArrayToString(prhs[0]);
if(pStr != NULL)
{
int nLen =
strlen(pStr);
plhs[0] =
mxCreateNumericMatrix(1, nLen, mxUINT8_CLASS, mxREAL);
void *pCode =
mxGetData(plhs[0]);
memcpy(pCode,
(void*)pStr, nLen);
mxFree(pStr);
pStr =
NULL;
}
else
{
plhs[0] =
mxCreateNumericMatrix(0, 0, mxUINT8_CLASS, mxREAL);
}
}
二、使用unicode2native和native2unicode函数
通过unicode2native转成本地编码,例如:
y=unicode2native(a,'CP936')
可以看到y是个长度为2的数组了,通过执行native2unicode,又可以吧y转回unicode编码。
一般情况下,从文件中读出来的汉字,最初的编码是native形式,要转成unicode形式,才可以显示出来。
而当你把汉字写入文件时,也要先转换成native形式,才可以写入。
下面是上述两个过程的一个转换实例:
%
% 假设二进制文件mytest里包含一个“日”字,
% 要把它显示出来,并要求写到另一个文件yourtest里。
%
fiIn=fopen('mytest','r'); %打开待读取文件
label=native2unicode(fread(fiIn,2,'uchar'),'CP936'); %读取文件并转成unicode编码
disp(label); %显示汉字
fiOut=fopen('yourtest','wt');