Skip to content

Commit 26aee95

Browse files
author
José Valim
committed
Merge pull request #1058 from meh/string-valid
Add String.valid?
2 parents baf5fcf + 1d6fd3c commit 26aee95

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

Diff for: lib/elixir/lib/string.ex

+29-1
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,34 @@ defmodule String do
458458
@spec next_codepoint(t) :: {codepoint, t} | :no_codepoint
459459
defdelegate next_codepoint(string), to: String.Unicode
460460

461+
@doc %B"""
462+
Checks whether `str` is a valid UTF-8 string.
463+
464+
## Examples
465+
466+
iex> String.valid?("a")
467+
true
468+
iex> String.valid?("ø")
469+
true
470+
iex> String.valid?(<<0xffff :: 16>>)
471+
false
472+
iex> String.valid?("asd" <> <<0xffff :: 16>>)
473+
false
474+
475+
"""
476+
@spec valid?(t) :: boolean
477+
def valid?(<<_ :: utf8, t :: binary>>) do
478+
valid?(t)
479+
end
480+
481+
def valid?(<<>>) do
482+
true
483+
end
484+
485+
def valid?(_) do
486+
false
487+
end
488+
461489
@doc %B"""
462490
Checks whether `str` is a valid codepoint.
463491
@@ -470,7 +498,7 @@ defmodule String do
470498
true
471499
iex> String.valid_codepoint?("ø")
472500
true
473-
iex> String.valid_codepoint?("\xffff")
501+
iex> String.valid_codepoint?(<<0xffff :: 16>>)
474502
false
475503
iex> String.valid_codepoint?("asdf")
476504
false

Diff for: lib/elixir/test/elixir/string_test.exs

+10-1
Original file line numberDiff line numberDiff line change
@@ -228,12 +228,21 @@ defmodule StringTest do
228228
assert String.slice("", 0, 1) == nil
229229
end
230230

231+
test :valid? do
232+
assert String.valid?("afds")
233+
assert String.valid?("øsdfh")
234+
assert String.valid?("dskfjあska")
235+
236+
refute String.valid?(<<0xffff :: 16>>)
237+
refute String.valid?("asd" <> <<0xffff :: 16>>)
238+
end
239+
231240
test :valid_codepoint? do
232241
assert String.valid_codepoint?("a")
233242
assert String.valid_codepoint?("ø")
234243
assert String.valid_codepoint?("あ")
235244

236-
refute String.valid_codepoint?("\xffff")
245+
refute String.valid_codepoint?(<<0xffff :: 16>>)
237246
refute String.valid_codepoint?("ab")
238247
end
239248

0 commit comments

Comments
 (0)