You can represent both side by side:
SWI-Prolog (threaded, 64 bits, version 8.1.22)
?- atom_codes(X, [304, 122, 109, 105, 114]), atom_codes(X, L).
X = 'İzmir',
L = [304, 122, 109, 105, 114].
?- atom_codes(X, [73, 775, 122, 109, 105, 114]), atom_codes(X, L).
X = 'İzmir',
L = [73, 775, 122, 109, 105, 114].
The ISO core standard doesn’t require that the glyph you see corresponds one-to-one to the character code or some character codes inside an atom. Some Prolog systems tried to built in some normalization into their atoms, but gave up:
"An additional restriction is that the sequence of characters that makes up a quoted token must be in Normal Form C (NFC). This is currently (SICStus Prolog 4.0.3) not enforced. A future release may enforce this restriction or perform this normalization automatically. "
https://sicstus.sics.se/sicstus/docs/4.1.0/html/sicstus/ref_002dsyn_002dsyn_002dtok.html
I guess the motivation might be some web thingy. But I am not sure whether its charmod as SICStus Prolog says, its rather the comparison operator and user data: Normalization FAQ.
Edit 24.02.2020:
I am afraid, will prevent on the beach for Jan W… Does SWI-Prolog have a comparison operator that does normalization on the fly? Would there be a demand for such a feature?
?- atom_codes(X, [73, 775, 122, 109, 105, 114]),
atom_codes(Y, [304, 122, 109, 105, 114]), compare(C, X, Y).
X = 'İzmir',
Y = 'İzmir',
C = (<).
On the other hand in my system I can do since latest release (and still a little experimental).
I get this for free from Java collator classes.
?- atom_codes(X, [73, 775, 122, 109, 105, 114]),
atom_codes(Y, [304, 122, 109, 105, 114]), compare(C, X, Y).
X = 'İzmir',
Y = 'İzmir',
C = <
?- atom_codes(X, [73, 775, 122, 109, 105, 114]),
atom_codes(Y, [304, 122, 109, 105, 114]), compare(C, X, Y, [type(collator)]).
X = 'İzmir',
Y = 'İzmir',
C = =