Ну ладно, раз уж тема приобретает хронический характер, давайте посмотрим на голанг опять же. Там принят utf-8, который можно за одно приведение типа превратить в "массив рун", где руной является code point.
Вот мой код для операции trim, упрощённый вот из этого:
https://github.com/budden/rqr/blob/mast ... ted.go#L15Код:
func trimToTheNumberOfRunes(s string, n int) (res string) {
r := []rune(s)
len := len(r)
if n < 0 {
panic("Negative n")
} else if len <= n {
res = s
} else {
res = string(r[0:n])
}
return
}
Что на самом деле делает внутри строчка r := []rune(s)? А не так уж мало. Она создаёт новый массив для чего-то типа int32 (опа, мы уже попали на выделение данных переменного размера - нагрузили сборщик мусора, а теперь ищем по форуму сообщения людей, которые специально пишут код так, чтобы сборщик мусора вообще не использовался, встаём на их место и уже начинаем плакать). Какого размера? Думаю, размер будет равен длине изначальной строчки байт (в которой записан текст в кодировке utf-8). Т.е., если у нас было N байт занято латиницей, то мы выделяем ещё 4N. Далее строчка парсится и записывается в массив. При этом utf-8 может оказаться невалидным - эти места записываются как специальная буква "ошибочный utf-8", а дальше, видимо, чтение восстанавливается. Замечательно здесь даже то, что процесс восстановления в данном случае находится вне нашего контроля, но допустим, если надо, мы можем навелосипедить своё.
После этого, слава Богу, мы получаем некий текст длины, как я надеюсь <= len(исходный массив байт). Т.к. что будет при ошибках чтения - я просто не знаю. Затем мы делаем trim массива и затем преобразуем обратно в string.
В случае же 8-разрядной, или 32-разрядной кодировки trim - это просто обрезание массива до нужной длины. Это различие между O(1) и O(N) позволяет, например, заспамить наш сервер гигантскими URL-ами, разбор которых вызовет замедление работы. Т.е. вот так, на ровном месте, опять получили уязвимость.
Вот тут есть живой пример с этой функцией:
https://play.golang.org/p/_9GORMo2FTGМожете убедиться, что хой превратился в хои (кривое и-краткое я взял отсюда
https://play.golang.org/p/7N_sYD6FAIo)
И это представляет из себя угрозу безопасности даже.
Кроме того, посмотрите, как безобразно визуализируется в журнале []runes - "конь" печатается как [1082 1086 1085 1100].
Если международные стандарты создают препятствия в работе и делают задачи неразрешимыми, а сервера уязвимыми, то нужно подумать, следовать ли таким стандартам.