当前位置: 首页 > news >正文

第六章 使用系统类提供国家语言支持 - 创建自定义语言环境

文章目录

  • 第六章 使用系统类提供国家语言支持 - 创建自定义语言环境
    • 创建自定义语言环境

第六章 使用系统类提供国家语言支持 - 创建自定义语言环境

创建自定义语言环境

此示例将提供一个模板,用于使用自定义表创建自定义语言环境。自定义表将在 EBCDIC(美国使用的通用格式)和 Latin-1 (ISO-8859–1) 之间转换。

对于任何其他表,首先我们需要获得字符映射的定义。对于此示例,我们使用来自网站 http://source.icu-project.org(International Components for Unicode) 的数据文件。相关数据文件是一个文本文件,其注释行以井号 (#) 开头,然后是一系列格式的翻译定义行:

<Uuuuu>  \xee |0

该文件的一小段如下所示:

#
#UNICODE EBCDIC_US
#_______ _________
<U0000>  \x00 |0
<U0001>  \x01 |0
<U0002>  \x02 |0
<U0003>  \x03 |0
<U0004>  \x37 |0
<U0005>  \x2D |0
...

这些行表明 Unicode 字符 Uaaaa 映射到 EBCDIC 字符 \xbb(其中 aaaabb 以十六进制表示)。我们假设该表是可逆的,并且 EBCDIC 字符 \xbb 映射回 Unicode 字符 Uaaaa。这使我们能够在单次扫描中从同一数据文件创建两面(即 EBCDIC-to-Latin1Latin1-to-EBCDIC)。因为 Unicode 范围只是从 0255,所以这实际上是一个 Latin-1 表。

该过程首先创建 SubTable 对象,然后是 Table,最后是 Locale。对于第一步,该过程创建两个 SubTables 对象,初始化它们的 NameType 属性,然后用从定义文件中读取的数据填充 FromTo 映射数组。

子表名称采用 Type–FromEncoding–ToEncoding 形式。常规 I/O 转换的类型是“XLT”,因此子表名称将是 XLT-yEBCDIC-Latin1XLT-yLatin1-EBCDIC

以下代码创建 SubTables 对象。在真实世界的程序中,代码将执行许多一致性检查,为了清楚起见,此处省略了这些检查。此示例删除相同对象(子表、表和区域设置)的现有先前版本,以便您可以多次运行该示例。更恰当地说,您应该使用类方法 Exists() 检查以前的对象是否存在,如果它们已经存在,则采取不同的操作。

  // Names for the new SubTables (save for later)Set nam1 = "XLT-Latin1-yEBCDIC"Set nam2 = "XLT-yEBCDIC-Latin1"// Delete existing SubTables instances with same idsDo ##class(Config.NLS.SubTables).Delete(nam1)Do ##class(Config.NLS.SubTables).Delete(nam2)// Create two SubTable objectsSet sub1 = ##class(Config.NLS.SubTables).%New()Set sub2 = ##class(Config.NLS.SubTables).%New()// Set Name and DescriptionSet sub1.Name = nam1Set sub1.Description = "ICU Latin-1->EBCDIC sub-table"Set sub2.Name = nam2Set sub2.Description = "ICU EBCDIC ->Latin-1 sub-table"

SubTables 对象包含一个属性 type,它是一个小整数,指示我们是否正在处理多字节转换。此示例将类型设置为零,表示单字节映射。初始化映射,以便将数据文件中未定义的代码点(字符)映射到它们自己。

  // Set Type (single-to-single)Set sub1.Type = 0Set sub2.Type = 0// Initialize FromTo arraysFor i = 0 : 1 : 255{Do sub1.FromTo.SetAt(i, i)Do sub2.FromTo.SetAt(i, i)}

接下来应用程序读取文件。文件中的定义会覆盖那些设置为默认映射的定义。函数 $ZHEX() 将代码从十六进制转换为十进制。

  // Assume file is in the mgr directorySet file = "glibc-EBCDIC_US-2.1.2.ucm"// Set EOF exit trapSet $ZTRAP = "EOF"// Make that file the default deviceOpen fileUse fileFor{Read xIf x?1"<U"4AN1">".E{Set uni = $ZHEX($E(x,3,6)),ebcdic = $ZHEX($E(x,12,13))Do sub1.FromTo.SetAt(ebcdic,uni)Do sub2.FromTo.SetAt(uni,ebcdic)}}EOF  // No further dataSet $ZT = ""Close file// Save SubTable objectsDo sub1.%Save()Do sub2.%Save()

字符映射现已完成。下一步是创建引用刚刚定义的 SubTables 对象的 Table 对象。表对象实际上是子表的描述符,只有几个属性。下面的代码建立了两者之间的联系:

  // Delete existing Tables instances with same idsDo ##class(Config.NLS.SubTables).Delete("XLT", "Latin1", "yEBCDIC")Do ##class(Config.NLS.SubTables).Delete("XLT", "yEBCDIC", "Latin1")// Create two Table objectsSet tab1 = ##class(Config.NLS.Tables).%New()Set tab2 = ##class(Config.NLS.Tables).%New()// Set descriptionSet tab1.Description = "ICU loaded Latin-1 -> EBCDIC table"Set tab2.Description = "ICU generated EBCDIC -> Latin-1 table"// Set From/To encodingsSet tab1.NameFrom = "Latin1"Set tab1.NameTo = "yEBCDIC"Set tab2.NameFrom = "yEBCDIC"Set tab2.NameTo = "Latin1"// Set SubTableSet tab1.SubTableName = nam1Set tab2.SubTableName = nam2// Set TypeSet tab1.Type = "XLT"Set tab2.Type = "XLT"// Set Default Action// 1 = Replace with replacement valueSet tab1.XLTDefaultAction = 1Set tab2.XLTDefaultAction = 1// Set Replacement value of "?"Set tab1.XLTReplacementValue = $ASCII("?")Set tab2.XLTReplacementValue = $ASCII("?")// Set Reversibility// 1 = Reversible// 2 = GeneratedSet tab1.XLTReversibility = 1Set tab2.XLTReversibility = 2// Set Translation Type// 0 = non-modal to non-modalSet tab1.XLTType = 0Set tab2.XLTType = 0// Save Table objectsDo tab1.%Save()Do tab2.%Save()

定义好表后,构建的最后一步是定义一个将包含新表的语言环境对象。应用程序创建一个空的 Locale 对象并像对表和子表所做的那样填充每个属性。然而,Locale 更大更复杂。进行此类简单更改的最简单方法是复制现有语言环境并仅更改我们需要的内容。此过程使用 enu8 作为源语言环境并将新语言环境命名为 yen8。开头的 y 清楚地表明这是一个自定义语言环境,不应在升级时删除。

  // Delete existing Locales instance with the same idDo ##class(Config.NLS.Locales).Delete("yen8")// Open source localeSet oldloc = ##class(Config.NLS.Locales).%OpenId("enu8")// Create cloneSet newloc = oldloc.%ConstructClone()// Set new Name and DescriptionSet newloc.Name = "yen8"Set newloc.Description = "New locale with EBCDIC table"

设置好语言环境后,该进程现在将 EBCDIC 表添加到启动时加载的 I/O 表列表中。这是通过在数组属性 XLTTables 中插入一个节点来完成的,如下所示:

XLTTables(<TableName>) = <components>
  • tablename 标识此语言环境的一对输入和输出表。

    因为名称不需要以 y 开头,所以我们使用 EBCDIC

  • components 是一个四项列表,如下所示:

  1. 输入“From”编码
  2. 输入“To”编码
  3. 输出“From”编码
  4. 输出“To”编码

以下代码将表格添加到可用语言环境列表中:

  // Add new table to localeSet component = $LISTBUILD("yEBCDIC", "Latin1", "Latin1", "yEBCDIC")Do newloc.XLTTables.SetAt(component, "EBCDIC")

IRIS 可以使用语言环境之前,必须将其编译成其内部形式。这有时也称为验证语言环境。 IsValid() 类方法进行详细分析并返回两个数组,一个用于错误,一个用于警告,如果语言环境未正确定义,则带有人类可读的消息。

  // Check locale consistencyIf '##class(Config.NLS.Locales).IsValid("yen8", .Errors, .Warns){Write !,"Errors: "ZWrite ErrorsWrite !,"Warnings: "ZWrite WarnsQuit}// Compile new localeSet status = ##class(Config.NLS.Locales).Compile("yen8")If (##class(%SYSTEM.Status).IsError(status)){Do $System.OBJ.DisplayError(status)}Else{Write !,"Locale yen8 successfully created."}

相关文章:

第六章 使用系统类提供国家语言支持 - 创建自定义语言环境

文章目录第六章 使用系统类提供国家语言支持 - 创建自定义语言环境创建自定义语言环境第六章 使用系统类提供国家语言支持 - 创建自定义语言环境 创建自定义语言环境 此示例将提供一个模板&#xff0c;用于使用自定义表创建自定义语言环境。自定义表将在 EBCDIC&#xff08;美…...

「题解」解决二进制数中1的个数

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练 &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下定决心去做” &#x1f680;&#x1f680;&#x1f680;大家觉不错…...

泛型详解.

1 泛型的引入 问题&#xff1a;我们之前实现过的顺序表&#xff0c;只能保存 int 类型的元素&#xff0c;如果现在需要保存 指向 Person 类型对象的引用的顺序表&#xff0c;请问应该如何解决&#xff1f;如果又需要保存指向 Book 对象类型的引用呢&#xff1f; 之前写的顺序表…...

Vue 3.0 响应性 深入响应性原理 【Vue3 从零开始】

现在是时候深入了&#xff01;Vue 最独特的特性之一&#xff0c;是其非侵入性的响应性系统。数据模型是被代理的 JavaScript 对象。而当你修改它们时&#xff0c;视图会进行更新。这让状态管理非常简单直观&#xff0c;不过理解其工作原理同样重要&#xff0c;这样你可以避开一…...

升级 vue3 常见问题总汇

Ⅰ、前言 虽然 vue3 是没有删除 vue2 的 选项式 API &#xff0c; 但是我们升级vue3 还是需要修改很多问题的下面来看看我们升级常见的一些问题 &#x1f447; 文章目录Ⅰ、前言Ⅱ、解决兼容问题1、路由的创建方式2、路由的方法变化3、升级 vuex 到 4.x4、作用域 插槽语法修改…...

汽车 Automotive > T-BOX GNSS高精定位测试相关知识

参考&#xff1a;https://en.wikipedia.org/wiki/Global_Positioning_SystemGPS和GNSS的关系GPS&#xff08;Global Positioning System&#xff09;&#xff0c;全球定位系统是美国军民两用的导航定位卫星系统&#xff0c;GPS包含双频信号&#xff0c;频点L1、L2和L5GNSS&…...

大数据面试核心101问【大厂超级喜欢这些题】

之前出过《史上最全的大数据开发八股文》这篇文章&#xff0c;同学们都觉得还不错&#xff0c;但是有些同学觉得那个背起来还是有些吃力&#xff0c;于是我再次回顾了自己之前面试所有大厂的一些面试题以及牛客上面的一些面经&#xff0c;然后总结了频率问的最高的101问&#x…...

代码随想录算法训练营第四十八天 | leetcode 121. 买卖股票的最佳时机,122.买卖股票的最佳时机II

代码随想录算法训练营第四十八天 | leetcode 121. 买卖股票的最佳时机&#xff0c;122.买卖股票的最佳时机II121. 买卖股票的最佳时机122.买卖股票的最佳时机II121. 买卖股票的最佳时机 题目&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支…...

RAD 11.3 delphi和C++改进后新增、废弃及优化的功能

RAD 11.3 delphi和C改进后新增和废弃的功能 目录 RAD 11.3 delphi和C改进后新增和废弃的功能 一、版本RAD 11.3 delphi和C改进后新增功能 1、官方视频位置&#xff1a; 2、官方文档的链接位置&#xff1a; 二、版本RAD 11.3 delphi和C改进后废弃的功能 2.1、编译器不再使…...

【C++】引用

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、引用1.1 引用概念1.2 引用特性…...

LPNet for Image Derain

Lightweight Pyramid Networks for Image Deraining前置知识高斯-拉普拉斯金字塔图像中的高频信息和低频信息为什么高斯-拉普拉斯金字塔可以实现去雨&#xff1f;可能性分析网络结构整体结构&#xff1a;子网结构&#xff1a;递归块结构&#xff1a;后续补充代码 前置知识 这…...

【NLP相关】基于现有的预训练模型使用领域语料二次预训练

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

使用git进行项目管理--git使用及其常用命令

使用git进行项目管理 文章目录 使用git进行项目管理git使用1.添加用户名字2.添加用户邮箱3.git初始化4.add5.commit6.添加到gitee仓库7.推送到gitee8.切换版本git常用命令git add把指定的文件添加到暂存区中添加所有修改、已删除的文件到暂存区中添加所有修改、已删除、新增的文…...

Mybatis_CRUD使用

目录1 Mybatis简介环境说明:预备知识:1.1 定义1.2 持久化为什么需要持久化服务呢&#xff1f;1.3 持久层1.4 为什么需要Mybatis2 依赖配置3 CRUDnamespaceselect &#xff08;查询用户数据&#xff09;※传值方式&#xff1a;于方法中传值使用Map传值insert &#xff08;插入用…...

JVM的过程内分析和过程间分析有什么区别?

问&#xff1a; 目前所有常见的Java虚拟机对过程间分析的支持都相 当有限&#xff0c;要么借助大规模的方法内联来打通方法间的隔阂&#xff0c;以过程内分析&#xff08;Intra-Procedural Analysis&#xff0c; 只考虑过程内部语句&#xff0c;不考虑过程调用的分析&#xff…...

LearnDash测验报告如何帮助改进您的课程

某一个场景。Pennywell 大学有一门课程“Introduction to Linear Algebra”。上学期进行了两次测验。20% 的学生在第一次测验中不及格&#xff0c;而 80% 在第二次测验中不及格。在进一步评估中&#xff0c;观察到第一次测验不及格的学生在第二次测验中也不及格。在第二次测验中…...

如何通过Java将Word转换为PDF

Word是我们日常编辑文档内容时十分常用的一种文档格式。但相比之下&#xff0c;PDF文档的格式、布局更为固定&#xff0c;不易被更改。在保存或传输较为重要的文档内容时&#xff0c;PDF文档格式也时很多人的不二选择。很多时候我们都会遇到需要将Word转换为PDF的情况。下面我就…...

DOM型XSS

DOM型XSSDOM是什么DOM型XSSDOM型XSS实操DOM是什么 DOM就是Document。 文档是由节点构成的集合&#xff0c;在DOM里存在许多不同类型的节点&#xff0c;主要有&#xff1a;元素节点、文本节点&#xff0c;属性节点。 元素节点&#xff1a;好比< body >< p >< h …...

04-项目立项:项目方案、可行性分析、产品规划、立项评审

文章目录4.1 项目方案立项阶段4.2 可行性分析4.3 产品规划4.4 立项评审4.4.1 立项说明书的主要内容4.4.2 立项评审流程章节总结4.1 项目方案 学习目标&#xff1a; 能够输出产品项目方案 项目开发设计流程的主要阶段&#xff1a; 立项阶段 → 设计阶段 → 开发阶段 → 测试阶…...

数据分享|NPP VIIRS夜间灯光数据(2012-2020逐月)

2011年10月美国的“索米”国家极轨卫星伙伴卫星(Suomi National Polar-orbiting Partnership or Suomi NPP)发射,它搭载的VIIRS传感器上有一个称为DNB(Day Night Band)的波段能够在500米分辨率(比原来的OLS提高6倍)的尺度上对地表开展每天覆盖全球一次的高灵敏度(比OLS提…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...