【问题标题】:Determine the number of characters which are allowed in a field?确定字段中允许的字符数?
【发布时间】:2019-10-02 14:07:44
【问题描述】:

这是SAP RFC: nuc_length vs uc_length的后续问题

使用 PyRFC,我可以像这样获得 func_description:

get_function_description(rfc_name)

我可以阅读每个字段uc_lengthnuc_length

如果 nuc_length=40 和 uc_length=80,我如何确定可以放入字段中的 unicode 字符数?

【问题讨论】:

  • RFC_CHAR, RFC_NUM, RFC_DATE, RFC_TIME -> nuc_length(非 UniCode 系统的字节数)总是给出最大字符数,因为在非 UniCode ABAP 系统中,1 字节 = 1 个字符。请注意,RFC_DATE 始终是 8 个数字字符 (YYYYMMDD),而 RFC_TIME 始终是 6 个数字字符 (hhmmss)。 RFC_STRING 是具有可变字符数的字符串(最大约 2 GB)。其他 RFC_* 类型不是字符字段。
  • 我通过切换 40 和 80 更正了问题(40 个字符对应 nuc_length=40 字节和 uc_length=80 字节)
  • @SandraRossi 非常感谢您纠正我的错字。

标签: sap saprfc pyrfc


【解决方案1】:

不幸的是,我认为这是不可能的。 根据给定的字节长度,您只能计算适合此字段的最大字符数。

对于 unicode ABAP 系统,我们知道 SAP 将字符数据存储在 UTF-16(大小端格式)的代码页 4102 / 4103 中。这意味着一个字符至少需要 2 个字节,即在您的示例中,最大长度可以计算为 uc_length / 2 = 40 个字符。我认为 SAP 尚未使用任何 4 字节字符。但是,这对于代码页 4102 / 4103 是可能的。因此,这取决于您将在该字段中输入哪个 Unicode 字符,在 uc_length=80 的字段中可以存储的字符可能少于 40 个。

这对于非 Unicode ABAP 系统来说更加困难。只要您只使用英文登录语言的代码页 1100,一个字符通常只需要 1 个字节。但是,例如,如果使用日语和代码页 8000,则文本数据可以包含混合的 US-ASCII 字符和日语字符。这意味着文本字段可能同时包含:1 字节字符和 2 字节字符。更难的是,对于包括代码页 1100 在内的所有非 unicode 代码页,甚至存在 3 字节字符。例如,有一些 SAP 特定字符图标/符号具有此长度。 因此,nuc_length=40 字段最多可以包含 40 个 Unicode 字符,但在最坏的情况下也只能包含 13 个字符。这取决于正在使用的代码页以及您在字段中填写的 Unicode 字符。

【讨论】:

  • 现在,从 ABAP 7.50 开始,只有 Unicode 系统。无需讨论可变宽度编码,dixit ABAP documentation:“ABAP 编程语言支持 UCS-2 覆盖的子集,而不是完整的 UTF-16 集。”
  • ABAP 与 UCS-2 一起使用(它不将 4 字节代理字符视为两个不同的“字符”),但历史 SAP GUI 软件(dynpro、ABAP 列表)将 4 -bytes 字符(U+10000-U+10FFFF)非常好。例如,?(U+20021,UTF-16 编码为 U+D840 & U+DC21)可以毫无问题地输入和渲染。 ? 内部占用 2 个字符,因此在 4 个字符的屏幕字段中,可以输入/渲染的最大字符数为 ??、?AA 或 AAAA。使用 SAP GUI 7.50 测试。
  • @Sandra Rossi:恭喜你现在只需要处理 Unicode 系统,并且不再需要讨论非 unicode 场景。也许你没有看到它,但需要很多年才能真正不再有这样的装置。甚至旧的 R/3 版本 3.1 还没有完全消失。从 6.10 版开始提供 Unicode 选项。
  • @Sandra Rossi:ABAP 语言运行时能做什么或不能做什么并不重要。这可能会随着下一个版本而改变。重要的是数据存储在哪个代码页中。那就是 UTF-16 AFAIK。您指出:U+20021 是一个以 UTF-16 格式存储的 4 个字节的单个字符。是的,ABAP 语言目前有这个 UCS-2 限制。我认为 SAP GUI 也超出了范围。 SAP GUI 还使用特殊的前端代码页来显示后端数据。如果它使用代码页 4103 并且您在本地安装了适当的字体,它将显示为一个字符。
  • 我完全同意。关于“没必要”,抱歉太肯定了。关于 SAP GUI,我的意思是 SAP 决定让它解释 UTF-16 代理字符,他们并没有将其限制为 UCS-2,因此他们隐含承认 ABAP 字符变量可能包含 UTF-16(即包括 4 字节字符)。大家注意:我认为 ABAP 文档说它是 UCS-2,因为像“子字符串”这样的一些 ABAP 语句对于 4 字节字符有问题。我在最后一条评论中的勘误:“ABAP 与 UCS-2 一起使用(它确实将 4 字节的代理字符视为两个不同的“字符”)”
猜你喜欢
  • 2015-06-09
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 2012-01-22
相关资源
最近更新 更多