Lire l'encodage d'une chaine

peut on lire l’encodage d’une chaine ? si oui comment ?

Merci

Ça ?
<code 4D>
// On passe un code de caractère en 1er paramètre
// On récupère :
// - Le nom de l’encodage de ce caractère sous forme de chaine
// - Un booléen qui dira si un encodage USC-2 devra être utilisé pour l’envoi du SMS
// - $0 retourne un entier plus facile à analyser que le nom de l’encodage si le code caractère n’est pas reconnu on retourne -1
//
// $0 entier long -1 si erreur sinon de 1 à 34

// syntaxe : $L_Indice:=Get_Caractere_Alphabet(L_Code;->$T_Nom_encodage;->$B_Use_UCS2)
// ----------------------------------------------------
// Méthode : Get_Caractere_Alphabet
// Création : 17/03/12 à 18:59:25
// ----------------------------------------------------
// Bertrand Soubeyrand soub@soub.org

C_LONGINT($0;$1)
C_POINTER($2;$3)

$3->:=True

C_LONGINT($L_Decimale)
$L_Decimale:=$1
Case of
: (0<$L_Decimale) & ($L_Decimale<=127)

	$3->:=False
	$2->:="latin de base"
	$0:=1
	
: ($L_Decimale<=255)
	$2->:="supplément Latin-1"
	
	  // ces codes ne necessitent pas de passer en USC2
	
	ARRAY INTEGER($rI_Etendu_OK_C;32)
	$rI_Etendu_OK_C{1}:=132
	$rI_Etendu_OK_C{2}:=136
	$rI_Etendu_OK_C{3}:=140
	$rI_Etendu_OK_C{4}:=156
	$rI_Etendu_OK_C{5}:=161
	$rI_Etendu_OK_C{6}:=163
	$rI_Etendu_OK_C{7}:=165
	$rI_Etendu_OK_C{8}:=167
	$rI_Etendu_OK_C{9}:=196
	$rI_Etendu_OK_C{10}:=197
	$rI_Etendu_OK_C{11}:=198
	$rI_Etendu_OK_C{12}:=199
	$rI_Etendu_OK_C{13}:=200
	$rI_Etendu_OK_C{14}:=201
	$rI_Etendu_OK_C{15}:=209
	$rI_Etendu_OK_C{16}:=214
	$rI_Etendu_OK_C{17}:=220
	$rI_Etendu_OK_C{18}:=223
	$rI_Etendu_OK_C{19}:=224
	$rI_Etendu_OK_C{20}:=228
	$rI_Etendu_OK_C{21}:=229
	$rI_Etendu_OK_C{22}:=230
	$rI_Etendu_OK_C{23}:=231
	$rI_Etendu_OK_C{24}:=232
	$rI_Etendu_OK_C{25}:=233
	$rI_Etendu_OK_C{26}:=236
	$rI_Etendu_OK_C{27}:=241
	$rI_Etendu_OK_C{28}:=242
	$rI_Etendu_OK_C{29}:=246
	$rI_Etendu_OK_C{30}:=248
	$rI_Etendu_OK_C{31}:=249
	$rI_Etendu_OK_C{32}:=252
	
	$3->:=Choose(Find in array($rI_Etendu_OK_C;$L_Decimale)>=1;False;True)
	$0:=2
: ($L_Decimale<=383)
	$2->:="latin étendu A"
	$0:=3
: ($L_Decimale<=591)
	$2->:="latin étendu B"
	$0:=4
: ($L_Decimale<=685)
	$2->:="alphabet phonétique international"
	$0:=5
: ($L_Decimale<=767)
	$2->:="lettres modificatives avec chasse"
	$0:=6
: ($L_Decimale<=879)
	$2->:="diacritiques"
	$0:=7
: ($L_Decimale<=1023)
	$2->:="grec et copte"
	$0:=8
: ($L_Decimale<=1279)
	$2->:="cyrillique"
	$0:=9
: ($L_Decimale<=1327)
	$2->:="supplément cyrillique"
	$0:=10
: ($L_Decimale<=1423)
	$2->:="arménien"
	$0:=11
: ($L_Decimale<=1535)
	$2->:="hébreu"
	$0:=12
: ($L_Decimale<=1791)
	$2->:="arabe"
	$0:=13
: ($L_Decimale<=1871)
	$2->:="syriaque"
	$0:=14
: ($L_Decimale<=1919)
	$2->:="supplément arabe"
	$0:=15
: ($L_Decimale<=1983)
	$2->:="thâna"
	$0:=16
: ($L_Decimale<=2047)
	$2->:="n'ko"
	$0:=17
: ($L_Decimale<=2111)
	$2->:="samaritain(Unicode 5.2)"
	$0:=18
: ($L_Decimale<=2143)
	$2->:="mandéen(Unicode 6.0)"
	$0:=19
: ($L_Decimale<=2207)
	$2->:="—"
	$0:=20
: ($L_Decimale<=2303)
	$2->:="(arabe étendu A)"
	$0:=21
: ($L_Decimale<=2431)
	$2->:="dévanâgarî"
	$0:=22
: ($L_Decimale<=2559)
	$2->:="bengali"
	$0:=23
: ($L_Decimale<=2687)
	$2->:="gourmoukhî"
	$0:=24
: ($L_Decimale<=2815)
	$2->:="goudjarati(gujarâtî)"
	$0:=25
: ($L_Decimale<=2943)
	$2->:="oriya"
	$0:=26
: ($L_Decimale<=3071)
	$2->:="tamoul"
	$0:=27
: ($L_Decimale<=3199)
	$2->:="télougou"
	$0:=28
: ($L_Decimale<=3327)
	$2->:="kannara"
	$0:=29
: ($L_Decimale<=3455)
	$2->:="malayâlam"
	$0:=30
: ($L_Decimale<=3583)
	$2->:="singhalais"
	$0:=31
: ($L_Decimale<=3711)
	$2->:="thaï"
	$0:=32
: ($L_Decimale<=3839)
	$2->:="lao"
	$0:=33
: ($L_Decimale<=4095)
	$2->:="tibétain"
	$0:=34
Else 
	$2->:="Code de caractère non pris en charge"
	$0:=-1

End case

</code 4D>

merci bertrand, mais maintenant que je connais l’encodage pourquoi la conversion ne fonctionne pas.

exemple :

$machaine:=“SANS CB Tél 0892560188 je réponds à tes questions & te conseille (service 0.80E/mn+prix appel) ou par SMS envoie ROSA au 71700 (0,65E/SMS+prixSMS)\nSTOP au 36012”

si je souhaite la convertir en UTF-8

	CONVERT FROM TEXT($machaine;106;$blob)
	$mavar:=Convert to text($blob;UTF8 text without length)

or ceci ne fonctionne pas du tout et en plus la constante UTF-8 text without length génére un erreur

Erreur lors de l’exécution de la méthode “_CP1” à la ligne 85

(kTECUsedFallbacksStatus).

Error code: -8783 (CARB)
(kTECUsedFallbacksStatus).
component: ‘CARB’
task -9, name: ‘P_20’

merci de ton aide

laisse tomber j’ai trouvé

merci

text in 4D (field or variable) is always stored in UTF-16LE (the little endian).

as for external text (document or BLOB), there is no way to definitively ,know its encoding,
because encoding is just an interpretation of a sequence of bytes,
and “garbage” piece of text that semantically makes no sense is technically valid data.

some encodings (UTF-16LE, UTF-16BE, UTF-8) use a signature mark (BOM),
some encodings (Shift_JIS, UTF-8, etc) have intrinsic rules on byte sequences.

other than that, you can only make an educated guess based on some heuristics.

https://github.com/miyako/4d-plugin-text-convert

$err:=ICU Get good encodings ($euc;$encodings;$languages;$confidences)

based on ICU

$err:=CP Get good encodings ($euc;$codepages)

based on native APIs on Mac and Windows.