To convert vCard 2.1 to 3.0: change VERSION:2.1 to VERSION:3.0, convert bare type parameters (TEL;HOME:) to explicit TYPE= syntax (TEL;TYPE=HOME:), remove CHARSET and ENCODING=QUOTED-PRINTABLE declarations and change ENCODING=BASE64 to ENCODING=b for photos. Most platforms today work best with vCard 3.0, which is the safest version for universal compatibility.
Introduction
Version incompatibility is the number one technical issue in VCF file work. For example, an Android phone exports vCard 2.1, iCloud rejects it because it expects 3.0, and your CRM wants 4.0 for UTF-8 support. Understanding the exact differences between the three versions and knowing how to convert vCard version files is therefore essential for anyone who works with contacts across platforms.
This guide provides the complete property-by-property syntax comparison, working conversion steps for every direction (2.1 to 3.0, 3.0 to 4.0 and downgrade paths), and a platform compatibility table so you know exactly which version to target. We have been converting vCard files across every version at Univik since 2013.
If you are unsure whether VCF and vCard are the same format (they are), see our VCF to vCard guide for the full explanation of the naming difference and when conversion is actually needed. For a broader overview of when and why you actually need to convert VCF files (including encoding, splitting and merging scenarios beyond version changes), see our VCF to vCard compatibility guide.
Property Syntax Differences: 2.1 vs 3.0 vs 4.0
The three versions look similar at first glance, but the syntax rules are different. Here is the same contact written in each version:
| Property | vCard 2.1 | vCard 3.0 | vCard 4.0 |
|---|---|---|---|
| Version line | VERSION:2.1 |
VERSION:3.0 |
VERSION:4.0 |
| Phone (home) | TEL;HOME;VOICE:+1234 |
TEL;TYPE=HOME,VOICE:+1234 |
TEL;TYPE=home;VALUE=uri:tel:+1234 |
EMAIL;INTERNET:a@b.com |
EMAIL;TYPE=INTERNET:a@b.com |
EMAIL:a@b.com |
|
| Photo (embedded) | PHOTO;ENCODING=BASE64;JPEG: |
PHOTO;ENCODING=b;TYPE=JPEG: |
PHOTO;MEDIATYPE=image/jpeg:data:... |
| Character encoding | Per-property: CHARSET=UTF-8 |
File-level UTF-8 (no per-property CHARSET) | Always UTF-8 (mandatory) |
| Non-ASCII text | ENCODING=QUOTED-PRINTABLE |
Plain UTF-8 text (no QP encoding) | Plain UTF-8 text |
| RFC standard | RFC 2425 (proposed) | RFC 2426 | RFC 6350 |
Which Version Do You Need?
Use vCard 3.0 (Recommended Default)
vCard 3.0 works with the widest range of platforms: iCloud, Google Contacts, Outlook, Thunderbird, Android, iPhone and most CRM systems. It supports UTF-8 for international characters and has clean TYPE= syntax. If you are unsure which version to use, 3.0 is the safe choice.
When to Use Other Versions
Use vCard 2.1 only for legacy systems, older Android devices (pre-2015) or industrial/embedded hardware that requires it. Use vCard 4.0 when your target platform specifically requires it (some CRM APIs, CardDAV servers) or when you need features like the GENDER, KIND or MEMBER properties that only exist in 4.0.
Convert vCard 2.1 to 3.0
This is the most common conversion because Samsung phones and older Android devices export vCard 2.1, but iCloud and Google Contacts work best with 3.0. If you are importing contacts exported from a Samsung phone into iCloud, this is the conversion you need.
1
Change the VERSION line. Find VERSION:2.1 and replace with VERSION:3.0. This must be done for every contact in the file (each BEGIN:VCARD block has its own VERSION line).
2
Convert type parameters to TYPE= syntax. In 2.1, types are bare: TEL;HOME;VOICE:. In 3.0, they use explicit TYPE=: TEL;TYPE=HOME,VOICE:. Apply this to TEL, EMAIL, ADR and any other property with type parameters.
3
Remove per-property encoding. Delete ;CHARSET=UTF-8 and ;ENCODING=QUOTED-PRINTABLE from property lines. Decode any quoted-printable text (e.g., =C3=A9 becomes é) into plain UTF-8.
4
Update photo encoding. Change PHOTO;ENCODING=BASE64;JPEG: to PHOTO;ENCODING=b;TYPE=JPEG:. The actual Base64 image data stays the same.
Command-line shortcut (Linux/Mac): For a quick conversion of a file with ASCII-only contacts (no quoted-printable text), use sed:
sed -e 's/VERSION:2.1/VERSION:3.0/g' -e 's/;CHARSET=UTF-8//g' -e 's/ENCODING=BASE64/ENCODING=b/g' contacts.vcf > contacts_v3.vcf
This handles the VERSION and ENCODING changes but does not convert bare type parameters or decode quoted-printable text. For files with non-Latin characters or complex properties, use a dedicated converter tool or open the VCF file to inspect the properties first.
Convert vCard 3.0 to 4.0
Less common, but still needed for CardDAV servers and some modern CRM APIs that require the latest specification.
1
Change VERSION:3.0 to VERSION:4.0.
2
Convert TEL to URI format. In 3.0: TEL;TYPE=HOME:+1234567890. In 4.0: TEL;TYPE=home;VALUE=uri:tel:+1234567890. Note: type values become lowercase in 4.0.
3
Simplify EMAIL. In 3.0: EMAIL;TYPE=INTERNET:a@b.com. In 4.0: EMAIL:a@b.com (the INTERNET type is dropped as it is the default).
4
Update PHOTO to data URI. In 3.0: PHOTO;ENCODING=b;TYPE=JPEG:[base64data]. In 4.0: PHOTO;MEDIATYPE=image/jpeg:data:image/jpeg;base64,[base64data].
Downgrade vCard 3.0 to 2.1
This conversion is rarely needed, but some legacy systems and older industrial scanners still require vCard 2.1.
1
Change VERSION:3.0 to VERSION:2.1.
2
Convert TYPE= parameters to bare parameters. Change TEL;TYPE=HOME,VOICE: back to TEL;HOME;VOICE:.
3
Add CHARSET and ENCODING for non-ASCII text. If any contact names contain non-Latin characters, add ;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE to those properties and encode the text as quoted-printable.
4
Change photo ENCODING=b back to ENCODING=BASE64.
Encoding: The Hidden Conversion Issue
Encoding is the #1 cause of garbled characters after conversion. vCard 2.1 uses per-property encoding declarations (CHARSET=UTF-8 + ENCODING=QUOTED-PRINTABLE for non-ASCII text). vCard 3.0 and 4.0 use file-level UTF-8 with no per-property declarations. When converting 2.1 to 3.0, you must decode quoted-printable text into plain UTF-8, not just delete the ENCODING parameter. If you delete the parameter without decoding, characters like =C3=A9 will appear literally instead of as é.
To check if your VCF file contains quoted-printable encoding, search for “ENCODING=QUOTED-PRINTABLE” or look for sequences of =XX in contact names. If these are found, then you need a tool that properly decodes QP text during conversion. A simple find-and-replace in a text editor is not enough for these files because it will leave the encoded sequences as literal text.
Platform Compatibility Table
| Platform | Accepts 2.1 | Accepts 3.0 | Accepts 4.0 | Exports As |
|---|---|---|---|---|
| iCloud / iPhone | Partial (often rejects) | Yes (preferred) | Yes | 3.0 |
| Google Contacts | Yes | Yes (preferred) | Yes | 3.0 |
| Samsung (One UI) | Yes | Yes | Partial | 2.1 |
| Android (stock/Pixel) | Yes | Yes | Yes | 3.0 |
| Outlook Desktop | Yes | Yes | Partial | 2.1 (per contact) |
| Outlook.com (web) | Yes | Yes | Partial | N/A (CSV only) |
| Thunderbird | Partial | Yes | Partial | 3.0 |
| macOS Contacts | Yes | Yes | Yes | 3.0 |
| Zoho CRM | Yes | Yes | Partial | N/A |
| CardDAV servers | No | Yes | Yes (preferred) | Varies |
“Partial” means the platform will import the file but may drop some properties or display formatting issues. Therefore, for the safest results, always convert to the version marked “preferred” for your target platform before importing.
Common Problems and Fixes
iCloud rejects a vCard 2.1 file with “unable to import vCard”. iCloud often rejects vCard 2.1 files, especially those with ENCODING=QUOTED-PRINTABLE or missing FN properties. Convert the file to vCard 3.0 using the steps above. For detailed iCloud error troubleshooting, see our unable to import vCard guide.
Contact names appear garbled after conversion (Chinese, Arabic, Korean characters). This happens when quoted-printable encoding is removed without decoding. The =XX sequences in the original file are actual encoded characters. You must decode them into UTF-8 during conversion, not just delete the ENCODING parameter. Use a proper conversion tool rather than text-editor find-and-replace for files with non-Latin characters.
Contact photos disappear after version conversion. If you changed ENCODING=BASE64 to ENCODING=b (or vice versa) but the photo still does not display, check that the Base64 data itself is intact. Some text editors add line breaks or whitespace during editing that corrupt the Base64 data. Open the file in a hex-aware editor or use a dedicated tool to preserve binary data integrity.
The converted file has the right VERSION line but the platform still rejects it. Changing the VERSION line alone is not enough. The property syntax must also match the declared version. If you declare VERSION:3.0 but still have bare type parameters (TEL;HOME: instead of TEL;TYPE=HOME:), strict parsers will reject the file. Apply all syntax changes listed in the conversion steps, not just the VERSION line.
Frequently Asked Questions
Can I just change the VERSION line without changing anything else?
For some lenient platforms (Google Contacts, Android), changing only the VERSION line may work because their parsers accept mixed syntax. However, strict platforms like iCloud will reject a file that declares VERSION:3.0 but uses vCard 2.1 syntax. So for reliable results, always apply all the syntax changes for the target version.
Which vCard version should I use for maximum compatibility?
vCard 3.0. It is accepted by every major platform (iCloud, Google, Outlook, Android, Mac, Thunderbird) and supports UTF-8 for international characters. vCard 2.1 is only needed for legacy systems and vCard 4.0 has limited support on some platforms.
How do I check what version my VCF file is?
Open the VCF file in a text editor and look for the VERSION property inside the first BEGIN:VCARD block. It will say VERSION:2.1, VERSION:3.0, or VERSION:4.0. If different contacts in the same file have different versions (which can happen after merging), you need to standardize them all to the same version.
Can a single VCF file contain contacts with different versions?
Technically yes, since each BEGIN:VCARD block has its own VERSION line. However, most platforms expect all contacts in a file to use the same version. Mixed-version files cause unpredictable import behavior. If you have a mixed file, standardize all contacts to one version before importing.
Why does Samsung export vCard 2.1 instead of 3.0?
Samsung’s One UI Contacts app has historically used vCard 2.1 for backward compatibility with older devices. This is a Samsung-specific behavior, not an Android standard (Pixel phones export 3.0). For Samsung-specific export details and workarounds, see our export Samsung contacts to VCF guide. The simplest fix is to import the Samsung VCF into Google Contacts and re-export, which produces a clean vCard 3.0 file.
Conclusion
Last verified: February 2026. Syntax differences verified against RFC 2426 (vCard 3.0) and RFC 6350 (vCard 4.0). Platform compatibility tested on iCloud (iOS 18, macOS 15), Google Contacts, Samsung Galaxy S24 (One UI 6.1), Pixel 9 (Android 15), Outlook 2024, Thunderbird 128, and Zoho CRM.
To convert vCard version files, the most common need is upgrading from 2.1 to 3.0: change the VERSION line, convert bare type parameters to TYPE= syntax, remove per-property CHARSET and ENCODING declarations (while properly decoding quoted-printable text), and update photo encoding from BASE64 to b. vCard 3.0 is the recommended target for maximum platform compatibility. For files with non-Latin characters, use a dedicated converter tool rather than manual text editing to avoid encoding corruption.
Three things to remember: vCard 3.0 is the safest version for universal compatibility (accepted by every major platform), changing only the VERSION line is not enough (property syntax must also match the declared version), and encoding is the hidden pitfall (always decode quoted-printable text when upgrading from 2.1 to 3.0 or characters will appear garbled).