我们开发了一个简单的HTML entity模拟,它在OS X上运行良好,但在Linux(Ubuntu 15.04)上运行不正常。 V-REP被用作主要的脚本语言。
我们在Linux上附加了以下代码(带有注释中的返回值),但不幸的是在Linux上返回<
(但在OS X上将nil
转换为数字而没有问题):
e[3]
真正有趣的是,前面的代码在Lua 5.2.3控制台(OS X和Linux)中都能正常工作。但是,在Linux上运行时,V-REP无法正确地将字符串转换为数字。
我们尝试了两个Lua(今天已下载),结果完全相同 - e[3] -- -0.677782532263
type(e[3]) -- string
type(tonumber(e[3])) -- nil
。你能指出一些我们遗漏的东西吗? Lua和V-REP都不是我们每天使用的工具。
编辑1: 我使用Ubuntu 15.04。 V-REP使用Lua 5.1,My Lua版本:
nil
在控制台中,我尝试了以下内容:
$ apt-cache policy lua5.1
lua5.1:
Installed: 5.1.5-7.1
Candidate: 5.1.5-7.1
Version table:
*** 5.1.5-7.1 0
500 http://cz.archive.ubuntu.com/ubuntu/ vivid/main amd64 Packages
100 /var/lib/dpkg/status
包
答案 0 :(得分:4)
错误是由于 V-REP 使用 Lua 5.1 ,而我们测试它的计算机有不同的数字区域设置(linux有{{ 1}}和mac有可能LC_NUMERIC=cs_CZ.UTF-8
)。
这意味着Mac上的Lua将字符串中的浮点数识别为数字,但Linux上具有不同语言环境的Lua没有 - 它没有逗号(例如{{1 }})作为区域设置所需的小数分隔符,因此它为转换返回了nil。
修复是在将vrep运行到en_US
语言环境之前设置-3,513
标志,如下所示:
LC_NUMERIC
会强制语言环境基于点,并使Lua能够识别数字。
感谢@Etan提供所有帮助,并从正确的方向探讨问题。
答案 1 :(得分:0)
另一种通过lua代码设置语言环境的方法,例如os.setlocale(“ C”)
并非所有系统都可以在启动时更改任意应用程序的语言环境,有时有时需要更改整个系统的语言环境,这对于其他应用程序可能不方便。如果使用V-REP分发的脚本以与XML文件相同的方式分发,其中分隔符是一个句点而不是一个逗号,那么在调用tonumber函数之前,应该从LUA安装正确的控制台是合乎逻辑的而不是外部,通过开放环境的变量。
LUA文档清楚地描述了os.setLocale函数的用途,并明确指出它影响字符串到数字的转换。并指出需要在调用转换函数之前确保正确的设置。
此外,在自己内部更改语言环境的脚本更具可移植性,因为不需要启动人员就应该从外部指定V-REP的哪些环境变量的知识。