【问题标题】:OrientDB having trouble with Unicode, Turkish, and enumsOrientDB 在 Unicode、土耳其语和枚举方面遇到问题
【发布时间】:2011-09-11 22:27:45
【问题描述】:

我正在使用一个具有枚举类型的库,其中包含类似这样的常量;

Type.SHORT
Type.LONG
Type.FLOAT
Type.STRING

当我在 Eclipse 中调试时,出现错误:

No enum const class Type.STRİNG

由于我使用的是土耳其语系统,所以在工作 i>İ 时会出现问题,但由于这是一个枚举常量,即使我将每个属性都设置为 UTF-8,也没有什么可以得到 STRING 是 Eclipse 应该寻找的。但它仍然在寻找 STRİNG 并且它找不到并且我不能使用它。我必须为此做些什么?

Project > Properties > Resouce > 文本文件编码现在是 UTF-8。问题一直存在。

编辑:更多信息可能会提供一些我无法获得的线索; 我正在研究 OrientDB。这是我的第一次尝试,所以我不知道问题是否出在 OrientDB 包上。但是我正在使用许多其他库,我从未见过这样的问题。这个包里有一个OType枚举,我只是想连接数据库。

    String url = "local:database";
    ODatabaseObjectTx db = new ODatabaseObjectTx(url).
    Person person = new Person("John");
    db.save(person);
    db.close();

我还没有使用更多代码。数据库已创建,但随后我得到 java.lang.IllegalArgumentException:

Caused by: java.lang.IllegalArgumentException: No enum const class com.orientechnologies.orient.core.metadata.schema.OType.STRİNG
    at java.lang.Enum.valueOf(Unknown Source)
    at com.orientechnologies.orient.core.metadata.schema.OType.valueOf(OType.java:41)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLCreateProperty.parse(OCommandExecutorSQLCreateProperty.java:81)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLCreateProperty.parse(OCommandExecutorSQLCreateProperty.java:35)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLDelegate.parse(OCommandExecutorSQLDelegate.java:43)
    at com.orientechnologies.orient.core.sql.OCommandExecutorSQLDelegate.parse(OCommandExecutorSQLDelegate.java:28)
    at com.orientechnologies.orient.core.storage.OStorageEmbedded.command(OStorageEmbedded.java:63)
    at com.orientechnologies.orient.core.command.OCommandRequestTextAbstract.execute(OCommandRequestTextAbstract.java:63)
    at com.orientechnologies.orient.core.metadata.schema.OClassImpl.addProperty(OClassImpl.java:342)
    at com.orientechnologies.orient.core.metadata.schema.OClassImpl.createProperty(OClassImpl.java:258)
    at com.orientechnologies.orient.core.metadata.security.OSecurityShared.create(OSecurityShared.java:177)
    at com.orientechnologies.orient.core.metadata.security.OSecurityProxy.create(OSecurityProxy.java:37)
    at com.orientechnologies.orient.core.metadata.OMetadata.create(OMetadata.java:70)
    at com.orientechnologies.orient.core.db.record.ODatabaseRecordAbstract.create(ODatabaseRecordAbstract.java:142)
    ... 4 more

这里是 OType 类:http://code.google.com/p/orient/source/browse/trunk/core/src/main/java/com/orientechnologies/orient/core/metadata/schema/OType.java

和其他类; OCommandExecutorSQLCreateProperty: http://code.google.com/p/orient/source/browse/trunk/core/src/main/java/com/orientechnologies/orient/core/sql/OCommandExecutorSQLCreateProperty.java

第 81 行说:type = OType.valueOf(word.toString());

【问题讨论】:

  • 当您在输入Type.STR 后立即按CTRL+Space 时,Eclipse 是否自动完成正确?
  • 其实我不是直接打字用的。必须有类似反射或使用它的东西。但是作为你问题的答案,通过打字,没有问题。 Ctrl+Space 给了我 Type.STRING(正确,没有问题)
  • 也许反射调用枚举的代码存在问题——该值从何而来?用户输入来自仅限土耳其语的键盘,或发送İ 而不是I 的其他系统?
  • 感谢您的努力。我添加了一些我使用的代码,我希望能提供一些关于我想要做什么的线索。我在 Eclipse 上工作,直到现在,我从未见过这样的问题。我知道这种土耳其语编码可能有一些内容,但这个只是不同,我什至无法获得资源/第一点。这很奇怪,我认为它一定是某种“偏好”部分,但我所知道的所有偏好都显示 UTF-8,没有任何帮助。
  • 今晚的最后一件事,我刚刚检查了整个 OrientDB 主干并搜索了 STRİNG -- 什么也没找到。它必须在您的代码或配置文件中。

标签: java utf-8 character-encoding turkish orientdb


【解决方案1】:

我是否正确假设您正在使用土耳其语言环境运行该程序?然后似乎该错误在 OCommandExecutorSQLCreateProperty 的第 118 行:

linkedType = OType.valueOf(linked.toUpperCase());

您必须指定应该使用大写规则的区域设置,可能是Locale.ENGLISH 作为toUpperCase 的参数。

【讨论】:

  • 非常感谢。我认为目前最合理的答案是你的。但是我该怎么做呢?我只使用这个库,为什么这只发生在这个库上?
  • 我发现了问题,不是在你指出的那条线上,而是非常相似。在 OCommandExecuterSQLAbstract 第 40 行中有一个“toUpperCase()”方法。它给了我 STRİNG 作为土耳其语言环境应该给出的。我将语言环境更改为 Locale.setLocale(Locale.ENGLISH),效果很好。但有个问题;如果我需要使用土耳其语数据,并且我没有土耳其语语言环境,那将是另一个问题。我建议 OrientDB 通过将代码更改为 toUpperCase(Locale.ENGLISH); 来解决这个问题。我们会看看会发生什么:) 非常感谢
  • 我已使用此解决方案并以 OrientDB SVN r3818 的身份提交。我离开了 .toUpperCase() SQL 运算符,因为使用区域设置来处理土耳其语文本是正确的。 lvc@
【解决方案2】:

此问题与您的数据库连接有关。据推测,OrientDB 中某处有一个字符串,您正在阅读它,然后尝试使用它来选择枚举的成员。

我假设在您发布的代码中变量word 来自数据库中的数据。如果它来自其他地方,那么问题就是“其他地方”。如果 OrientDB 出于某种奇怪的原因返回 'STRİNG' 作为元数据来告诉您某物的类型,那么这确实是 OrientDB 中的一个缺陷。

如果该字符串实际上包含 İ,则 Eclipse 设置不会对结果产生任何影响。您必须编写代码以规范化 İ 到 I。

如果您将 'word' 的内容作为字符串的chars 的十六进制值序列转储,我想您会看到您的 İ 正盯着您。您必须更改数据库中的内容才能拥有一个普通的旧 I。

【讨论】:

  • 谢谢。好吧,实际上即使数据库上没有数据也会发生。这个异常是在创建数据库时抛出的,我什至什么都没放。那我应该多想想OrientDB类的问题?
  • 这似乎表明问题出在 OrientDB 元数据中。 String 是支持的数据类型之一吗?您使用的是土耳其语版本的 OrientDB 或其驱动程序吗?很难想象这种基本的东西会通过 QA,但除非您正在管理元数据(可能是映射文件?),否则我会在其中查看。
  • 我没有使用任何土耳其语版本。只有我的操作系统(Windows7)是土耳其语(也许 JVM 将默认语言环境设置为土耳其语),但我也不使用任何 Eclipse 插件或任何包/库、OrientDB 及其驱动程序的土耳其语版本。我认为 String 数据类型作为支持没有问题。而且,我不是在管理元数据/映射,我只是在开始:)
【解决方案3】:

不幸的是,它与区域设置有关,您的操作系统的语言环境是土耳其语。

两种解决方法:

1. Change your regional settings to English-US

2. Give encoding to the jvm as command line param for setting locale to English

    -Duser.language=en -Duser.region=EN

我为 xmlbeans、exist 和 apache cxf 创建了相同问题的错误报告。枚举 toUpper 是异常的点。

一些相关链接:

https://issues.apache.org/jira/browse/XMLSCHEMA-22

http://mail-archives.apache.org/mod_mbox/xmlbeans-user/201001.mbox/%3CSNT123-DS11993DD331D6CA7799C46CF6650@phx.gbl%3E

http://mail-archives.apache.org/mod_mbox/cxf-users/201203.mbox/%3CBLU0-SMTP115A668459D9A0DA11EA5FAF6460@phx.gbl%3E

https://vaadin.com/forum/-/message_boards/view_message/793105

http://comments.gmane.org/gmane.comp.apache.cxf.user/18316

【讨论】:

    【解决方案4】:

    一种解决方法是输入Type.ST,然后按Ctrl-空格键。 Eclipse 应该自动完成变量名,而您不必弄清楚如何在土耳其语键盘上输入无点大写字母 I。 :)

    【讨论】:

    • 这没有问题。只是所谓的,Eclipse 出错了。
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多