Skip to content

Commit 3ce0480

Browse files
committed
windows: UTF16PtrToString use strings builder
1 parent 47c892f commit 3ce0480

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

windows/syscall_windows.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package windows
88

99
import (
1010
errorspkg "errors"
11+
"strings"
1112
"sync"
1213
"syscall"
1314
"time"
@@ -125,14 +126,24 @@ func UTF16PtrToString(p *uint16) string {
125126
return ""
126127
}
127128

128-
var encoded []uint16
129-
for *p != 0 {
130-
encoded = append(encoded, *p)
129+
var sb strings.Builder
130+
131+
for r := rune(*p); r != 0; r = rune(*p) {
132+
if !utf16.IsSurrogate(r) {
133+
sb.WriteRune(r)
134+
} else {
135+
p = (*uint16)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p)))
136+
sb.WriteRune(utf16.DecodeRune(r, rune(*p)))
137+
138+
if *p == 0 {
139+
break
140+
}
141+
}
131142

132143
p = (*uint16)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + unsafe.Sizeof(*p)))
133144
}
134145

135-
return string(utf16.Decode(encoded))
146+
return sb.String()
136147
}
137148

138149
func Getpagesize() int { return 4096 }

0 commit comments

Comments
 (0)