目錄
如何快速獲取字符串的UTF-8或UTF-16編碼二進制數據?
數值轉換成字符串itoa不是C標準?
其它類型轉換成字符串
其它類型轉換成數值類型
轉換成數值的API
為什么有的編程語言允許字符串和整數相加?
字符串拼接
字符串字面量自動連接
如何快速獲取字符串的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等編程技術的技巧經驗分享),若作品對您有幫助,請關注、分享、點贊、收藏、在看、喜歡,您的支持是我們為您提供幫助的最大動力。