Strings and Unicode in Depth

SRFI-13 (classic) / SRFI-130 (cursor-based) / SRFI-152 (minimal)

string-index, string-contains, string-join, string-tokenize, string-trim, string-pad

Regular expressions with an s-expression syntax ((regexp-search '(+ digit) "ab12"))

Guile (ice-9 regex), CHICKEN (chicken irregex) / irregex Immutable texts (O(1) indexing)

(import (scheme char))
(string-length "λx.x")             ; 4 (characters, not bytes)
(string-upcase "straße")           ; "STRASSE" (full case mapping in many implementations)
(string-foldcase "ΣΑΣ")            ; case folding for comparison
(string-ci=? "Hello" "HELLO")      ; #t
(char-upcase #\ß)                  ; #\ß (char-level mapping is 1:1)
(string->utf8 "€")                 ; #u8(226 130 172)

;; Splitting a string (portable helper)
(define (string-split str ch)
  (let loop ((chars (string->list str)) (cur '()) (acc '()))
    (cond ((null? chars) (reverse (cons (list->string (reverse cur)) acc)))
          ((char=? (car chars) ch) (loop (cdr chars) '() (cons (list->string (reverse cur)) acc)))
          (else (loop (cdr chars) (cons (car chars) cur) acc)))))
(string-split "a,b,,c" #\,)        ; ("a" "b" "" "c")

(define (string-join lst sep)
  (if (null? lst)
      ""
      (fold-left* (lambda (acc s) (string-append acc sep s)) (car lst) (cdr lst))))
(string-join '("a" "b" "c") ", ")  ; "a, b, c"