• 字符串

    編輯
    本詞條由“匿名用戶” 建檔。

    什么是字符串

    編輯

    計算機編程中,字符串傳統上是一個字符序列,可以是字面常量,也可以是某種變量。后者可能允許其元素發生變異并改變長度,或者它可能是固定的(在創建之后)。字符串通常被認為是一種數據類型,通常被實現為字節(或單詞)的數組數據結構,它使用某種字符編碼存儲一系列元素,通常是字符。字符串也可以表示更通用的數組或其他序列(或列表)數據類型和結構。

    根據所使用的編程語言和精確的數據類型,聲明為字符串的變量可能會導致內存中的存儲被靜態分配給預定的xxx長度,或者采用動態分配來允許它保存可變數量的元素。

    當一個字符串在源代碼中按字面意思出現時,它被稱為字符串文字或匿名字符串。

    在數學邏輯和理論計算機科學中使用的形式語言中,字符串是從稱為字母表的集合中選擇的有限符號序列。

    字符串數據類型

    編輯

    字符串數據類型是根據正式字符串的概念建模的數據類型。字符串是如此重要和有用的數據類型,幾乎所有編程語言都實現了它們。在某些語言中,它們可用作原始類型,而在其他語言中可用作復合類型。大多數高級編程語言的語法允許通常以某種方式引用的字符串來表示字符串數據類型的實例。這樣的元字符串稱為文字或字符串文字。

    字符串長度

    盡管形式字符串可以具有任意有限長度,但實際語言中字符串的長度通常被限制為人為的xxx值。一般來說,有兩種類型的字符串數據類型:固定長度的字符串,它具有在編譯時確定的固定xxx長度,并且無論是否需要這個xxx值都使用相同的內存量,以及可變長度的字符串,其長度不是任意固定的,并且可以根據運行時的實際需求使用不同數量的內存(請參閱內存管理)。現代編程語言中的大多數字符串都是變長字符串。當然,即使是可變長度的字符串也有長度限制——受可用的大小電腦內存。字符串長度可以存儲為單獨的整數(這可能會對長度施加另一個人為限制)或通過終止字符隱式存儲,通常是所有位為零的字符值,例如在C編程語言中。另請參閱下面的“空終止”。

    字符編碼

    字符串數據類型在歷史上為每個字符分配一個字節,盡管確切的字符集因區域而異,但字符編碼非常相似,程序員通常可以忽略這一點,因為程序特殊處理的字符(例如句點、空格和逗號)在程序遇到的所有編碼中都在同一個位置。這些字符集通常基于ASCII或EBCDIC。如果一種編碼的文本在使用不同編碼的系統上顯示,則文本通常會被損壞,盡管通常有些可讀性,并且一些計算機用戶學會了閱讀損壞的文本。

    諸如中文、日文和韓文(統稱為CJK)等語標語言需要遠遠超過256個字符(每個字符編碼一個8位字節的限制)才能合理表示。正常的解決方案包括為ASCII保留單字節表示并為CJK表意文字使用兩字節表示。將這些與現有代碼一起使用會導致字符串匹配和切割問題,其嚴重程度取決于字符編碼的設計方式。一些編碼,例如EUCfamily保證ASCII范圍內的字節值將僅表示該ASCII字符,從而使編碼對于使用這些字符作為字段分隔符的系統是安全的。其他編碼(例如ISO-2022和Shift-JIS)不提供此類保證,從而導致字節碼匹配不安全。這些編碼也不是“自同步”的,因此定位字符邊界需要備份到字符串的開頭,并且將兩個字符串粘貼在一起可能會導致第二個字符串損壞。

    Unicode稍微簡化了圖片。大多數編程語言現在都有Unicode字符串的數據類型。Unicode的首選字節流格式UTF-8被設計為不存在上述舊多字節編碼的問題。UTF-8、UTF-16和UTF-32要求程序員知道固定大小的代碼單元不同于“字符”,目前的主要困難是試圖隱藏這種差異的錯誤設計的API(UTF-32確實使代碼點固定大小,但由于組成代碼,這些不是“字符”)。

    實現

    某些語言,例如C++和Ruby,通常允許在創建字符串后更改其內容;這些被稱為可變字符串。在其他語言中,例如Java和Python,該值是固定的,如果要進行任何更改,則必須創建一個新字符串;這些被稱為不可變字符串(其中一些語言還提供了另一種可變類型,例如Java和.NETStringBuilder、線程安全的JavaStringBuffer和CocoaNSMutableString)。

    字符串通常實現為字節、字符或代碼單元的數組,以允許快速訪問單個單元或子字符串——包括具有固定長度的字符。一些語言,如Haskell,將它們實現為鏈表。

    某些語言,例如Prolog和Erlang,根本避免實現專用的字符串數據類型,而是采用將字符串表示為字符代碼列表的約定。

    表示

    字符串的表示在很大程度上取決于字符庫的選擇和字符編碼的方法。較舊的字符串實現旨在使用由ASCII或更新的擴展(如ISO8859系列)定義的曲目和編碼。現代實現通常使用由Unicode定義的廣泛的曲目以及各種復雜的編碼,例如UTF-8和UTF-16。

    術語字節串通常表示通用的字節串,而不是僅(可讀)字符的串、位串等。字節字符串通常意味著字節可以取任何值,并且任何數據都可以按原樣存儲,這意味著不應該有任何值被解釋為終止值。

    大多數字符串實現非常類似于可變長度數組,其中條目存儲相應字符的字符代碼。主要區別在于,對于某些編碼,單個邏輯字符可能會占用數組中的多個條目。例如,UTF-8會發生這種情況,其中單個代碼(UCS代碼點)可以占用一到四個字節,單個字符可以占用任意數量的代碼。在這些情況下,字符串的邏輯長度(字符數)與數組的物理長度(使用的字節數)不同。UTF-32避免了問題的xxx部分。

    空終止

    可以使用特殊的終止字符隱式存儲字符串的長度;這通常是空字符(NUL),它的所有位都為零,這是流行的C編程語言使用和延續的約定。因此,這種表示通常被稱為C字符串。這種n字符字符串的表示占用n+1個空格(1表示終止符),因此是一個隱式數據結構。

    在終止字符串中,終止代碼不是任何字符串中允許的字符。帶有長度字段的字符串沒有這個限制,也可以存儲任意二進制數據。

    字節和位終止

    使用除null之外的特殊字節來終止字符串在歷史上已經出現在硬件和軟件中,盡管有時它的值也是一個打印字符。$被許多匯編系統:使用,被CDC系統使用(這個字符的值為零),并且ZX80使用\"因為這是其BASIC語言中的字符串分隔符。

    有點類似,像IBM1401這樣的“數據處理”機器使用特殊的字標記位在左側分隔字符串,操作將從右側開始。該位必須在字符串的所有其他部分中清除。這意味著,盡管IBM1401有一個7位字,但幾乎沒有人想過將其用作一項功能,并覆蓋第七位的分配以(例如)處理ASCII代碼。

    早期的微型計算機軟件依靠ASCII碼不使用高位這一事實,并將其設置為指示字符串的結尾。它必須在輸出前復位為0。

    長度前綴

    字符串的長度也可以顯式存儲,例如通過在字符串前面加上長度作為字節值。這種約定用于許多帕斯卡方言;因此,有些人稱這樣的字符串為Pascal字符串或P-string。將字符串長度存儲為字節會將xxx字符串長度限制為255。為避免此類限制,P字符串的改進實現使用16、32或64位字來存儲字符串長度。當長度字段覆蓋地址空間時,字符串僅受可用內存的限制。

    如果長度是有界的,那么它可以在常量空間中編碼,通常是一個機器字,從而導致一個隱式數據結構,占用n+k空間,其中k是一個字中的字符數(8表示8位ASCII在64位機器上,1代表32位UTF-32/UCS-4在32位機器上,等等)。如果長度無界,編碼長度為n占用log(n)空間(參見固定長度代碼),因此長度前綴字符串是一種簡潔的數據結構,在log(n)+n空間中編碼長度為n的字符串.

    文字字符串

    編輯

    有時,字符串需要嵌入到文本文件中,該文件既可供人類閱讀,又可供機器使用。這在例如編程語言的源代碼或配置文件中是必需的。在這種情況下,NUL字符不能很好地用作終止符,因為它通常是不可見的(不可打印)并且難以通過鍵盤輸入。存儲字符串長度也很不方便,因為手動計算和跟蹤長度既繁瑣又容易出錯。

    字符串

    兩種常見的表示是:

    • 用引號括起來(ASCII0x22雙引號或ASCII0x27單引號),被大多數編程語言使用。為了能夠包含特殊字符,例如引號本身、換行符或不可打印字符,通常可以使用轉義序列,通常以反斜杠字符(ASCII0x5C)為前綴。
    • 由換行符終止,例如在WindowsINI文件中。

    非文本字符串

    編輯

    雖然字符串是字符串的常見用法,但計算機科學中的字符串通常指的是任何同質類型數據的序列。例如,位串或字節串可用于表示從通信介質檢索的非文本二進制數據。根據應用程序的需要、程序員的愿望以及所使用的編程語言的能力,這些數據可能會或可能不會由特定于字符串的數據類型表示。如果編程語言的字符串實現不是8-bitclean,可能會導致數據損壞。

    C程序員在“字符串”(也稱為“字符串”)與“字節字符串”或“偽字符串”(可以存儲在同一個數組中但通常不會以null終止。在這樣的“字節字符串”上使用C字符串處理函數通常似乎可行,但后來會導致安全問題。

    字符串處理算法

    編輯

    處理字符串的算法有很多種,每種算法都有不同的取舍。可以根據運行時間、存儲要求等分析競爭算法。

    一些類別的算法包括:

    高級字符串算法通常采用復雜的機制和數據結構,其中包括后綴樹和有限狀態機。

    內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/131722/

    (3)
    詞條目錄
    1. 什么是字符串
    2. 字符串數據類型
    3. 字符串長度
    4. 字符編碼
    5. 實現
    6. 表示
    7. 空終止
    8. 字節和位終止
    9. 長度前綴
    10. 文字字符串
    11. 非文本字符串
    12. 字符串處理算法

    輕觸這里

    關閉目錄

    目錄
    91麻精品国产91久久久久