Octave是免费的matlab语言解释器,适合用作子程序,进行复杂的数学计算。但Octave和Matlab本身不支持Unicode字符作为标识符。如果要用Unicode字符作为Matlab程序的标识符,需要对其进行转义。
Matlab程序中可用的字符还停留在早期的C语言水平,是目前支持的字符最少的编程语言。我们需要在53个标准字符中选择一个转义字符。我选择下划线作为转义字符,因为在驼峰命名法中,下划线用量较少。
我定义的转义规则为:
1、下划线写作:"_U";
2、52个拉丁字母,运算符,空白字符和换行符保留原样;
3、其余可见的文字转换成小写16进制UTF8编码,并以"_H"开头,以"_X"结尾。
按此规则,我们写一个中文的Matlab函数,文件名为"lab.utf8m"。
function [输出1, 输出2]=lab(【一】, 【二】)
输出1 = 【一】 + 【二】;
输出2 = 【一】 - 【二】;
end
然后写一个主程序来调用它,主程序名为"主程序.utf8m"。
[结果1,结果2]=lab(1,2);
结果1
结果2
然后运行自动转换程序,将上面的代码转换成如下代码,文件名为"lab.m"。
function [_He8be93e587ba_X1, _He8be93e587ba_X2]=lab(_He38090e4b880e38091_X, _He38090e4ba8ce38091_X)
_He8be93e587ba_X1 = _He38090e4b880e38091_X + _He38090e4ba8ce38091_X;
_He8be93e587ba_X2 = _He38090e4b880e38091_X - _He38090e4ba8ce38091_X;
end
主程序的名字是中文,所以文件名也自动转换成"_He4b8bbe7a88be5ba8f_X.m",也就是"主程序"的UTF8转义字符串。
[_He7bb93e69e9c_X1,_He7bb93e69e9c_X2]=lab(1,2);
_He7bb93e69e9c_X1
_He7bb93e69e9c_X2
在其它语言编写的控制台程序中启动octave控制台,将字符串"主程序"转义后,从管道输入octave,读取octave的返回字符串,转义为中文后显示出来。
实际从后台收到的字符串是:
_He7bb93e69e9c_X1 = 3
_He7bb93e69e9c_X2 = -1
转义后显示结果如下:
结果1 = 3
结果2 = -1
下面是转义函数的Java示范代码
/**
* Unicede标识符转换为标准标识符
*
* @param unicode
* @param isStandardChar
* @return
*/
public static String convertUnicodeIdentifierToStandardIdentifier(String unicode,
Function isStandardChar) {
if (unicode == null) {
return null;
}
unicode = unicode.replace("_", "_U");
boolean isAscii = true;
StringBuilder writer = new StringBuilder();
for (int i = 0; i < unicode.length(); ++i) {
char c = unicode.charAt(i);
if (isStandardChar.apply(c)) {
if (!isAscii) {
writer.append("_X");
}
writer.append(c);
isAscii = true;
continue;
} else {
String hex;
try {
if (isAscii) {
writer.append("_H");
}
hex = StaticDataUtils.convertBytesToHexString(String.valueOf(c).getBytes("utf-8"), true, "",
' ');
writer.append(hex);
} catch (UnsupportedEncodingException e) {
StaticJavaUtils.exit(e);
}
isAscii = false;
}
}
if (!isAscii) {
writer.append("_X");
}
return writer.toString();
}
/**
* 标准标识符转换为Unicode标识符
*
* @param standard
* @return
*/
public static String convertStandardIdentifierToUnicodeIdentifier(String standard) {
if (standard == null) {
return null;
}
StringBuilder writer = new StringBuilder();
List subString = StaticStringUtils.getSubStringList(standard, true, "_H", "_X");
boolean isAscii = true;
for (String s : subString) {
if (isAscii) {
writer.append(s);
} else {
byte[] bytes = StaticDataUtils.convertHexStringToBytes(s);
try {
writer.append(new String(bytes, "utf-8"));
} catch (UnsupportedEncodingException e) {
StaticJavaUtils.exit(e);
}
}
isAscii = !isAscii;
}
return writer.toString().replace("_U", "_");
}