草庐IT

c - 如何禁用字符代码 178 (0xB2) (²) 、179 (0xB3) (³) 和 185 (0xB9) (¹) 作为数字?

coder 2024-06-06 原文

使用 SWI-Prolog 生成数字时使用

code_type(X,digit).

结果是预期的 ASCII 字符代码和

178 (0xB2) ²
179 (0xB3) ³
185 (0xB9) ¹

例如

code_type(X,digit).
X = 48 ;
X = 49 ;
X = 50 ;
X = 51 ;
X = 52 ;
X = 53 ;
X = 54 ;
X = 55 ;
X = 56 ;
X = 57 ;
X = 178 ;
X = 179 ;
X = 185 ;
false.

如何禁用或更改该功能,使 0-9 以外的字符不是数字?

显然我可以编写不同的例程,但我想知道是否没有可以执行此操作的选项或语句。

长话短说

版本

SWI-Prolog (Multi-threaded, 32 bits, Version 7.2.3)

SWI-序言标志

current_prolog_flag(Name,Value).

query_debug_settings: debug(false,false)

save_history: true

debug: false

generate_debug_info: true

verbose_load: silent

emulated_dialect: swi

sandboxed_load: false

optimise: false

toplevel_var_size: 1000

allow_dot_in_atom: false

toplevel_prompt: ~m~d~l~! ?- 

toplevel_print_anon: true

access_level: user

verbose_autoload: false

toplevel_extra_white_line: true

gui: true

timezone: 18000

verbose_file_search: false

char_conversion: false

history: 25

colon_sets_calling_context: true

verbose: normal

traditional: false

agc_margin: 10000

encoding: text

readline: false

break_level: 0

xpce: true

write_attributes: ignore

answer_format: ~p

quasi_quotations: true

bounded: false

min_tagged_integer: -16777216

integer_rounding_function: toward_zero

gmp_version: 5

xpce_version: 6.6.66

dde: true

gc: true

write_help_with_overstrike: false

user_flags: silent

address_bits: 32

max_tagged_integer: 16777215

allow_variable_name_as_functor: false

editor: pce_emacs

debug_on_error: true

shared_object_extension: dll

xpce_threaded: true

resource_database: c:/program files (x86)/swipl/boot32.prc

debugger_show_context: false

character_escapes: true

shared_object_search_path: PATH

iso: false

large_files: true

debugger_write_options: [quoted(true),portray(true),max_depth(10),attributes(portray),spacing(next_argument)]

pipe: true

c_cflags: 

open_shared_object: true

threads: true

unload_foreign_libraries: false

home: c:/program files (x86)/swipl

prompt_alternatives_on: determinism

system_thread_id: 12492

dialect: swi

pid: 9796

executable: C:\Program Files (x86)\swipl\bin\swipl-win.exe

c_cc: gcc

last_call_optimisation: true

qcompile: false

warn_override_implicit_import: true

unknown: error

c_ldflags: 

print_write_options: [portray(true),quoted(true),numbervars(true)]

c_libs: 

c_libplso: -lswipl

max_arity: unbounded

report_error: true

trace_gc: false

autoload: true

answer_write_options: [quoted(true),portray(true),max_depth(10),spacing(next_argument)]

debug_term_position: false

back_quotes: codes

occurs_check: false

compile_meta_arguments: false

os_argv: [C:\Program Files (x86)\swipl\bin\swipl-win.exe,--win_app]

argv: []

emacs_inferior_process: false

cpu_count: 4

file_name_variables: false

color_term: true

version_data: swi(7,2,3,[])

hwnd: 924196

version_git: 7.2.3

console_menu: true

toplevel_residue_vars: false

double_quotes: string

stream_type_check: loose

windows: true

fileerrors: true

version: 70203

signals: true

arch: i386-win32

toplevel_print_factorized: false

compiled_at: Aug 25 2015, 13:45:56

tty_control: true

SWI-Prolog 语言环境

current_locale(X).
X = default.

locale_property(X,Y).
X = default,
Y = alias(default) ;
X = default,
Y = decimal_point('.') ;
X = default,
Y = thousands_sep(',') ;
X = default,
Y = grouping([repeat(3)]).

Windows

Windows PowerShell

PS C:\>  Get-UICulture

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)


PS C:\> Get-CimInstance Win32_OperatingSystem | FL *

Status                                    : OK
Name                                      : Microsoft Windows 10 Pro|C:\WINDOWS|\Device\Harddisk0\Partition4
FreePhysicalMemory                        : 853644
FreeSpaceInPagingFiles                    : 7062504
FreeVirtualMemory                         : 2415552
Caption                                   : Microsoft Windows 10 Pro
InstallDate                               : 8/4/2016 8:35:18 AM
CreationClassName                         : Win32_OperatingSystem
CSCreationClassName                       : Win32_ComputerSystem
CurrentTimeZone                           : -300
LastBootUpTime                            : 1/11/2017 1:41:34 PM
LocalDateTime                             : 1/14/2017 3:48:46 PM
MaxNumberOfProcesses                      : 4294967295
MaxProcessMemorySize                      : 137438953344
OSType                                    : 18
Version                                   : 10.0.14393
BuildNumber                               : 14393
BuildType                                 : Multiprocessor Free
CodeSet                                   : 1252
CountryCode                               : 1
DataExecutionPrevention_32BitApplications : True
DataExecutionPrevention_Available         : True
DataExecutionPrevention_Drivers           : True
DataExecutionPrevention_SupportPolicy     : 2
Debug                                     : False
Locale                                    : 0409
Manufacturer                              : Microsoft Corporation
MUILanguages                              : {en-US}
OperatingSystemSKU                        : 48
Organization                              : Windows User
OSArchitecture                            : 64-bit
OSLanguage                                : 1033
OSProductSuite                            : 256
PortableOperatingSystem                   : False
Primary                                   : True
ProductType                               : 1
ServicePackMajorVersion                   : 0
ServicePackMinorVersion                   : 0
SuiteMask                                 : 272
SystemDirectory                           : C:\WINDOWS\system32
SystemDrive                               : C:
WindowsDirectory                          : C:\WINDOWS

输出

code_type(X,digit).
X = 48 ;
X = 49 ;
X = 50 ;
X = 51 ;
X = 52 ;
X = 53 ;
X = 54 ;
X = 55 ;
X = 56 ;
X = 57 ;
X = 178 ;
X = 179 ;
X = 185 ;
false.

X is 0'².
X = 178.

X is 0'³.
X = 179.

X is 0'¹.
X = 185.

code_type(47,digit).
false.
code_type(48,digit).
true.
code_type(0'0,digit).
true.
code_type(57,digit).
true.
code_type(58,digit).
false.
code_type(0'9,digit).
true.
code_type(177,digit).
false.
code_type(178,digit).
true.
code_type(179,digit).
true.
code_type(180,digit).
false.
code_type(184,digit).
false.
code_type(185,digit).
true.
code_type(186,digit).
false.

char_type(X,digit).
X = '0' ;
X = '1' ;
X = '2' ;
X = '3' ;
X = '4' ;
X = '5' ;
X = '6' ;
X = '7' ;
X = '8' ;
X = '9' ;
X = ² ;
X = ³ ;
X = ¹ ;
false.

我尝试/检查的内容

2.4 Command line options

code_type/2

As char_type/2, but uses character codes rather than one-character atoms. Please note that both predicates are as flexible as possible. They handle either representation if the argument is instantiated and will instantiate only with an integer code or a one-character atom, depending of the version used. See also the Prolog flag double_quotes, atom_chars/2 and atom_codes/2.

char_type/2

Tests or generates alternative Types or Chars.
The character types are inspired by the standard C <ctype.h> primitives.

char_type(?Char, ?Type)

digit - Char is a digit.

2.15.1.8 Unicode Prolog source

The SWI-Prolog Unicode character classification is based on version 6.0.0 of the Unicode standard. Please note that char_type/2 and friends, intended to be used with all text except Prolog source code, is based on the C library locale-based classification routines.

但不知道如何找到C library locale-based classification routines

我使用 swi prolog code_type digit 178 进行了谷歌搜索,但没有任何内容可以解释这一点。

2.18 Wide character support

SWI-Prolog supports wide characters, characters with character codes above 255 that cannot be represented in a single byte. Universal Character Set (UCS) is the ISO/IEC 10646 standard that specifies a unique 31-bit unsigned integer for any character in any language. It is a superset of 16-bit Unicode, which in turn is a superset of ISO 8859-1 (ISO Latin-1), a superset of US-ASCII. UCS can handle strings holding characters from multiple languages, and character classification (uppercase, lowercase, digit, etc.) and operations such as case conversion are unambiguously defined.

ISO/IEC 10646 - Unicode 6.0

0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;;
0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;;
0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;;
0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;;
0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;;
0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;;
0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;;
0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;;
0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;;
0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;;
00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;;
00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;;
00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;;

ISO 8859-1 显示 ¹ , ² , ³

US-ASCII

不同版本的 Windows 操作系统和/或 SWI-Prolog

我也卸载了32位版本,安装了64位版本
SWI-Prolog (Multi-threaded, 64 bits, Version 7.2.3 还是一样的结果。

我还在另一台从未安装过 SWI-Prolog 的 Windows 10 机器上安装了 64 位版本,结果仍然相同。

我检查了在 Windows 7 Ultimate Version 6.1.7601 上运行的旧版本 SWI-Prolog (Multi-threaded, 64 bits, Version 6.4.1),结果仍然相同。

其他引用资料

GitHub 上的 SWI-Prolog 源代码

src/os/pl-ctype.c

This module defines:

    char_type(?Char, ?Type)

    code_type(?Char, ?Type)

Windows-1252

解决方法

很多人都不知道这一点,因为它仍处于测试版,但使用 Windows 10 64 位可以运行 Ubuntu 软件包并在名为 Bash on Ubuntu on Windows < 的="" windows="" 子系统上执行其他="" ubuntu="" 操作/strong="">,也称为 Linux 的 Windows 子系统

安装 WSL 然后按照 Installing from PPA (Ubuntu Personal Package Archive) 上的说明启动 SWI-Prolog 后,我得到了预期的输出。

findall(C,char_type(C,digit),Cs).
Cs = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].

最佳答案

参见 section on locale support .如果你运行,从顶层:

?- current_locale(Locale).

并且您得到 Locale = default,那么您的当前线程正在使用系统语言环境。您可以通过运行(在 Linux 上)获取此信息:

$ locale

您应该能够使用其他内置函数,例如 locale_create/3locale_set/1,例如:

?- locale_create(Locale, "C", []),
   set_locale(Locale),
   findall(C, char_type(C, digit), Cs),
   locale_destroy(Locale).
Locale = <locale>(0x2043ec0),
Cs = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].

我的系统上没有安装任何有趣的语言环境,因此我无法轻松检查这是否真的是问题所在。

关于c - 如何禁用字符代码 178 (0xB2) (²) 、179 (0xB3) (³) 和 185 (0xB9) (¹) 作为数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41652772/

有关c - 如何禁用字符代码 178 (0xB2) (²) 、179 (0xB3) (³) 和 185 (0xB9) (¹) 作为数字?的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  7. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  8. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  9. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

  10. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

随机推荐