Skip to content

Instantly share code, notes, and snippets.

@msaby
Created September 7, 2011 19:28
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save msaby/1201480 to your computer and use it in GitHub Desktop.
Save msaby/1201480 to your computer and use it in GitHub Desktop.
Remplace les caractères latins modifiés par des diacritiques (ou accompagnés de diacritiques isolés) par des caractères latins simples
function remplace_diacritiques_latins (chaine) {
// Remplace les caractères latins modifiés par des diacritiques (ou accompagnés de diacritiques isolés) par des caractères latins simples.
// Valable pour le français la plupart des langues écrites en alphabet latin (langues européennes modernes + vietnamien)
// contexte d'utilisation : nettoyage d'une chaîne pour interrogation de catalogues de bibliothèques français ne supportant pas la présence de diacritiques
// exemple : éàô châu Điện Biên słowiańskie --> eao chau Dien Bien slowianskie
// limites :
// - pour accélérer le traitement, ne prend pas en compte certains caractères très rares (langues africaines), utilisés pour des langues mortes, ou pour l'alphabet phonétique international
// - ne traite pas les lettres "exotiques" qui n'ont pas d'équivalent strict dans la série [a-z] : "glottal stop", "whynn", "kra", etc., sauf les lettres islandaises Thorn et Eth, remplacées par "Th" et "D" (choix qui n'a aucune valeur officielle...)
// fonctionnement détaillé :
// supprime tous les diacritiques modificateurs : bloc des diacritiques (u0300-u036F) et des bloc des diacritiques supplémentaires (u1DC0-u1DFF)
// traite tous les caractères latins codés sur 1 octets en unicode (C0 Controls and Basic Latin, also called Basic Latin http://unicode.org/charts/PDF/U0000.pdf + C1 Controls and Latin-1 Supplement http://unicode.org/charts/PDF/U0080.pdf),
// traite une sélection de caractères sur 2 octets :
// - tout le bloc Latin Extended-A 0100–017F (http://unicode.org/charts/PDF/U0100.pdf) sauf un caractère obsolète
// - une sélection du bloc Latin Extended-B 0180–024F (http://unicode.org/charts/PDF/U0180.pdf) : lettres vietnamiennes, roumaines, slaves, livoniennes, chinoises (pinyin)
// - les lettres du bloc Latin Extended Additional 1E00–1EFF (http://unicode.org/charts/PDF/U1E00.pdf), sauf les lettres pour textes médiévaux
// Ne traite pas les caractères de l'IPA , du bloc Latin Extended-C 2C60–2C7F (http://unicode.org/charts/PDF/UA720.pdf) et du bloc Extended-D A720–A7FF (http://unicode.org/charts/PDF/UA720.pdf)
// Résout les ligatures et digrammes suivants : SS/ss ; ae/Ae ; Oe/oe ; IJ/ij ; DZ/Dz/dz ; NJ/Nj/nj ; LJ/Lj/lj
// Remarques et problèmes possibles :
// - O et o barré sont transcrits par O et o (on pourrait les transcrire également par Oe/oe)
// - en unicode, les umlaut allemands sont considérés comme des trémas -> ä, ü et ö deviennent a, u, o et non ae, ue, oe
// - les d/D barrés sont transcrits d/D (normal en Vietnamien, mais usuellement transcrit par Dj dans les langues balkaniques)
var diac_fr =[
// Tous les diacritiques codés sur un octet et Ÿ Œ œ
['a',/[\u00AA\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5]/g], // a
['A',/[\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5]/g], // A
['ae',/[\u00E6]/g], // ae
['Ae',/[\u00C6]/g], // Ae
['c',/[\u00E7]/g], // c
['C',/[\u00C7]/g], // C
['d',/[\u00F0]/g], // d
['D',/[\u00D0]/g], // D
['e',/[\u00E8\u00E9\u00EA\u00EB]/g], // e
['E',/[\u00C8\u00C9\u00CA\u00CB\u1EBA]/g], // E
['i',/[\u00EC\u00ED\u00EE\u00EF]/g], // i
['I',/[\u00CC\u00CD\u00CE\u00CF]/g], // I
['n',/[\u00F1]/g], // n
['N',/[\u00D1\u1E44]/g], // N
['o',/[\u00BA\u00F2\u00F3\u00F4\u00F5\u00F6\u00F8]/g], // o
['O',/[\u00D2\u00D3\u00D4\u00D5\u00D6\u00D8]/g], // O
['Oe',/[\u0152]/g], // Oe
['oe',/[\u0153]/g], // oe
['ss',/[\u00DF]/g], // ss
['T',/[\u1E6C]/g], // T
['Th',/[\u00DE]/g], // Th
['th',/[\u00FE]/g], // th
['u',/[\u00F9\u00FA\u00FB\u00FC\u1EE7]/g], // u
['U',/[\u00D9\u00DA\u00DB\u00DC]/g], // U
['W',/[\u1E84]/g], // W
['X',/[\u1E8C]/g], // X
['y',/[\u00FD\u00FF]/g], // y
['Y',/[\u00DD\u0178]/g], // Y
];
var diac_autres =[
// Tous les diacritiques sauf ceux codés sur un octet et Ÿ Œ œ
['A',/[\u0100\u0102\u0104\u01CD\u01FA\u0200\u0202\u023A\u1E00\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6]/g], // A
['a',/[\u0101\u0103\u0105\u01CE\u01FB\u0201\u0203\u1E01\u1E9A\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7]/g], // a
['Ae',/[\u01FC]/g], // Ae
['ae',/[\u01FD]/g], // ae
['B',/[\u1E02\u1E04\u1E06]/g], // B
['b',/[\u1E03\u1E05\u1E07]/g], // b
['C',/[\u0106\u0108\u010A\u010C\u023B\u1E08]/g], // C
['c',/[\u0107\u0109\u010B\u010D\u023C\u1E09]/g], // c
['D',/[\u010E\u0110\u1E0A\u1E0C\u1E0E\u1E10\u1E12]/g], // D
['d',/[\u010F\u0111\u1E0B\u1E0D\u1E0F\u1E11\u1E13]/g], // d
['DZ',/[\u01C4\u01F1]/g], // DZ
['DZ',/[\u01C5\u01F2]/g], // DZ
['dz',/[\u01C6\u01F3]/g], // dz
['E',/[\u0112\u0114\u0116\u0118\u011A\u0204\u0206\u0228\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6]/g], // E
['e',/[\u0113\u0115\u0117\u0119\u011B\u0205\u0207\u0229\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7]/g], // e
['f',/[\u0192\u1E1F]/g], // f
['F',/[\u1E1E]/g], // F
['G',/[\u011C\u011E\u0120\u0122\u01F4\u1E20]/g], // G
['g',/[\u011D\u011F\u0121\u0123\u01F5\u1E21]/g], // g
['H',/[\u0124\u0126\u1E22\u1E24\u1E26\u1E28\u1E2A]/g], // H
['h',/[\u0125\u0127\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E96]/g], // h
['I',/[\u0128\u012A\u012C\u012E\u0130\u01CF\u0208\u020A\u1E2C\u1E2E\u1EC8\u1ECA]/g], // I
['i',/[\u0129\u012B\u012D\u012F\u0131\u01D0\u0209\u020B\u1E2D\u1E2F\u1EC9\u1ECB]/g], // i
['IJ',/[\u0132]/g], // IJ
['ij',/[\u0133]/g], // ij
['J',/[\u0134]/g], // J
['j',/[\u0135]/g], // j
['K',/[\u0136\u1E30\u1E32\u1E34]/g], // K
['k',/[\u0137\u1E31\u1E33\u1E35]/g], // k
['L',/[\u0139\u013B\u013D\u013F\u0141\u023D\u1E36\u1E38\u1E3A\u1E3C]/g], // L
['l',/[\u013A\u013C\u013E\u0140\u0142\u1E37\u1E39\u1E3B\u1E3D]/g], // l
['LJ',/[\u01C7]/g], // LJ
['Lj',/[\u01C8]/g], // Lj
['lj',/[\u01C9]/g], // lj
['M',/[\u1E3E\u1E40\u1E42]/g], // M
['m',/[\u1E3F\u1E41\u1E43]/g], // m
['N',/[\u0143\u0145\u0147\u01F8\u1E44\u1E46\u1E48\u1E4A]/g], // N
['n',/[\u0144\u0146\u0148\u01F9\u1E45\u1E47\u1E49\u1E4B]/g], // n
['NJ',/[\u01CA]/g], // NJ
['Nj',/[\u01CB]/g], // Nj
['nj',/[\u01CC]/g], // nj
['O',/[\u014C\u014E\u0150\u01A0\u01D1\u01FE\u020C\u020E\u022A\u022C\u022E\u0230\u1E4C\u1E4E\u1E50\u1E52\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2]/g], // O
['o',/[\u014D\u014F\u0151\u01A1\u01D2\u01FF\u020D\u020F\u022B\u022D\u022F\u0231\u1E4D\u1E4F\u1E51\u1E53\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3]/g], // o
['P',/[\u1E54\u1E56]/g], // P
['p',/[\u1E55\u1E57]/g], // p
['R',/[\u0154\u0156\u0158\u0210\u0212\u1E58\u1E5A\u1E5C\u1E5E]/g], // R
['r',/[\u0155\u0157\u0159\u0211\u0213\u1E59\u1E5B\u1E5D\u1E5F]/g], // r
['S',/[\u015A\u015C\u015E\u0160\u0218\u1E60\u1E62\u1E64\u1E66\u1E68]/g], // S
['s',/[\u015B\u015D\u015F\u0161\u017F\u0219\u023F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E9B]/g], // s
['SS',/[\u1E9E]/g], // SS
['T',/[\u0162\u0164\u0166\u021A\u023E\u1E6A\u1E6C\u1E6E\u1E70]/g], // T
['t',/[\u0163\u0165\u0167\u021B\u1E6B\u1E6D\u1E6F\u1E71\u1E97]/g], // t
['U',/[\u0168\u016A\u016C\u016E\u0170\u0172\u01AF\u01D3\u01D5\u01D7\u01D9\u01DB\u0214\u0216\u1E72\u1E74\u1E76\u1E78\u1E7A\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0]/g], // U
['u',/[\u0169\u016B\u016D\u016F\u0171\u0173\u01B0\u01D4\u01D6\u01D8\u01DA\u01DC\u0215\u0217\u1E73\u1E75\u1E77\u1E79\u1E7B\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1]/g], // u
['V',/[\u1E7C\u1E7E]/g], // V
['v',/[\u1E7D\u1E7F]/g], // v
['W',/[\u0174\u1E80\u1E82\u1E84\u1E86\u1E88]/g], // W
['w',/[\u0175\u1E81\u1E83\u1E85\u1E87\u1E89\u1E98]/g], // w
['X',/[\u1E8A\u1E8C]/g], // X
['x',/[\u1E8B\u1E8D]/g], // x
['Y',/[\u0176\u0232\u1E8E\u1EF2\u1EF4\u1EF6\u1EF8]/g], // Y
['y',/[\u0177\u0233\u1E8F\u1E99\u1EF3\u1EF5\u1EF7\u1EF9]/g], // y
['Z',/[\u0179\u017B\u017D\u1E90\u1E92\u1E94]/g], // Z
['z',/[\u017A\u017C\u017E\u0240\u1E91\u1E93\u1E95]/g] // z
];
// suppression des signes diacritiques isolés
var diac_seuls = /[\u0300-\u036F\u1DC0-\u1DFF]/g; // bloc des diacritiques et des bloc des diacritiques suppléments
chaine = chaine.replace(diac_seuls,'');
// traitement en deux étapes, pour accélerer le traitement des chaînes sans caractères codés sur deux octets
// suppression des signes diacritiques sur 1 octet + 3 lettres pour le français français
for (var i = 0; i < diac_fr.length; i++) {
chaine = chaine.replace(diac_fr[i][1],diac_fr[i][0]);
}
// suppression des signes diacritiques sur 2 octets, uniquement s'il y en a
var car_etendus = /[\u0100-\u1EFE]/g;
if (car_etendus.test (chaine)) {
for (var i = 0; i < diac_autres.length; i++) {
chaine = chaine.replace(diac_autres[i][1],diac_autres[i][0]);
}
}
return chaine;
}
@msaby
Copy link
Author

msaby commented Sep 7, 2011

ça fait ce que je veux, mais le résultat final n'est pas tout à fait satisfaisant, parce qu'idref gère mal les caractères unicode...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment