让Octave支持中文

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", "_");
	}

 

你可能感兴趣的:(算法,java-desktop)