目录
如何快速获取字符串的UTF-8或UTF-16编码二进制数据?
如何快速获取字符串的UTF-8或UTF-16编码二进制数据?
- 在线字符编码转换网站
- Swift提供了非常简洁的编码二进制数据查看方法
let s = "a我a"
s.utf8.forEach { print($0, terminator: " ") } // UTF-8: 97 230 136 145 97
s.utf16.forEach { print($0, terminator: " ") } // UTF-16: 97 25105 97
数值转换成字符串itoa不是C标准?
itoa确实不是C标准规定,却是广泛被使用的非标准。建议使用标准库sprintf来实现itoa的功能。itoa不是标准可能有些难以理解,事实上,早期itoa存在多种不同风格参数,字符串也并不是C语言的一等公民,设计这个API反而产生更多负担和困扰。
其它类型转换成字符串
大部分编程语言将一个变量转换成字符串,一般会经过toString方法或者类型转换方法,形如C语言的itoa.
- Swift提供一种极其优雅的方法,可以用 \(VAR) 做转换。
var i = 10
let str = "I have \(i) apples"
print(str)
- JS
- 基本类型
null --> "null", undefined --> "undefined" (注意不是空字符串), 布尔类型分别是"true"和"false", 字符串本身就返回自身,Number类型转换成对应的字符串,比如12 --> "12", 1.23 --> "1.23". - 引用类型:先调用toString函数,如果得到基本类型,按上面规则转换字符串;如果不满足,继续调用valueOf函数,如果还是基本类型,再次重复上面的转换;如果还不满足,抛出异常。
- 基本类型
- 仓颉
基本类型可调用toString()函数转换成字符串。 - C#
- 语言定义了基本类型ToString()方法,自定义类可以重写ToString()方法。
- VB
- Str(num) 函数可以将数值转换成字符串,num可以是整数或浮点数,不能是非数值字符。注意,如果num是正数,字符串会有前导空白字符。CStr(num) 函数基本和Str(num)一样,除了它在num是正数时不会有前导空白字符。
其它类型转换成数值类型
很多静态类型编程语言,不允许将非数值类型转换成数值类型,一些脚本语言为了简化复杂度,允许非数值类型按照特定规则转换成数值类型。
- JS
- Undefined类型 --> NaN.
- Null类型 --> 0.
- Boolean类型 true --> 1, false --> 0.
- String类型根据是十进制还是十六进制或者浮点数,转换成对应数值。注意,这里没有八进制数值,字符串"012"转换成数值是十进制的12,而不是八进制的012.
如果是空字符串或者多个空格,数值是0,如果是除了如上的其他字符串,即是非法数值,转换结果是NaN. - Object类型转换为数值经过2个步骤,先调用valueOf()函数,按照如上规则,有合法数值即返回,如果返回NaN, 继续调用toString()函数,同样按照如上规则得到数值,如果没有数值类型返回,返回NaN.
- C#
- 基本类型提供隐式转换或者强制转换。
- 字符串转换成基本类型:
- <Type>.Parse(<String>)
例如int.Parse("123") - <Type>.TryParse(<String>, out <Val>) (C# 2.0 ?)
和Parse的区别是,此函数转换失败不会抛出异常。
- <Type>.Parse(<String>)
- 字符串转换成基本类型:
- System.Convert.ToXXX(<String>)
例如ToInt, ToFloat, ...
- System.Convert.ToXXX(<String>)
- VB
- Val(str) 将str转换成数值,如果str包含不能转换为数值的字符,转换就此终止,返回已解析的数值。例如:
Val("a12") 返回 0,Val("-123ab") 返回 -123.
- Val(str) 将str转换成数值,如果str包含不能转换为数值的字符,转换就此终止,返回已解析的数值。例如:
转换成数值的API
- JS
Number函数用于将任何类型转换成数值。
parseInt函数和parseFloat函数都可以将字符串转换为数值。要特别注意,传入字符串和数值类型将导致结果不同,数值类型的参数会先转换为字符串再参与转换。例如parseInt(0x10, 16)和parseInt('0x10', 16)结果分别是22和16.
为什么有的编程语言允许字符串和整数相加?
C#/Java语言为了方便字符串拼接,字符串和其他类型执行加法,其它类型会隐式自动转换成字符串,最后是拼接的结果。这极大方便了字符串操作,但这并不是编程语言的通用设计。
- Swift希望类型安全,不允许字符串和数字相加,必须都是字符串才可以相加。为减少因此设计带来的不便,它又提供字符串插值方法,可在字符串中插入其它类型变量,会自动转换成字符串。
let a = 4
let s = "number: \(a)"
利用字符串里面的反斜杠\和括号()的组合,即可插入变量a到字符串中。
字符串拼接
大部分更高级编程语言支持用+做两个字符串拼接/连接,例如Java/C#/Python/JS/Ruby/Swift/Kotlin/Go.
- C/ObjC/C++把字符串当做数值类型的指针,不允许两个指针相加。
- 但如果是字符串和整数相加,等同于指针加法。
- 例如”hello” + 1是字符串”ello”.
- 但如果是字符串和整数相加,等同于指针加法。
- Java/C#均支持字符串相加,包括字符串 + <其他类型>(其他类型自动转换成字符串)。
- Python支持两个字符串相加,也支持复合赋值运算符+=做字符串拼接,但不允许字符串和整数相加。
- PHP和Perl利用.和.=实现字符串拼接,不能使用+连接字符串。
- Rust有所有权机制,字符串拼接需做转换。
let s1 = "Hello, ".to_string();
let s2 = "world!".to_string();
let s3 = s1 + &s2; - 仓颉 支持两个字符串相加,但不允许字符串和其他类型相加。如需要,其他类型必须调用toString转换成字符串。另外,也支持复合赋值 += 作用于字符串。
- VB 有两种运算符方式拼接字符串。
- & 拼接字符串或非字符串,注意,& 同时也是长整型类型符,当做字符串拼接需要和运算数有空格。
- + 运算符:如两个运算数都是数值,表示数值相加;一个是数值另一个是数值字符串,一样是数值加法;两个都是字符串,做字符串拼接;其他情况,报错。
- Python 也支持两个字符串相加。
字符串字面量自动连接
- C/ObjC/C++ 支持多个字符串字面量自动连接,例如:
"hello " "world"代表"hello world".- C# 等语言不支持。
若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。